用插入法实现多项式的乘法

#include"iostream"
#include"stdio.h"
#include"string.h"
#include"algorithm"
#include"queue"
#include"stack"
#include"ctype.h"
#include"cmath"
#define mx 1005
using namespace std;

struct poly //链表节点数据类型
{
    double ceof;//系数
    int exp;//指数
    poly *next;
};
double A[mx],B[mx];//存放A和B表达式
int adegree,bdegree,maxexp;//存放最高阶数

void init(poly *&pl) //链表初始化
{
    pl=new poly;//动态分配空间,如果出现错误则输出 allocate error
    if(pl==NULL){cout<<"allocate error!"<<endl;}
    else
    {
        pl->next=NULL;
    }
}

void input(poly *&pl,int degree,double X[]) //表达式的输入(存入链表中)
{
    poly *t=pl;
    int i=0;
    while(i<=degree)
    {
        if(X[i]!=0) //系数为零的不用存
        {
            t->next=new poly;
            t=t->next;
            t->ceof=X[i];
            t->exp=i;
        }
        i++;
    }
    t->next=NULL;
}

void output(poly *&pl) //表达式的输出
{
    poly *t=pl->next;
    cout<<"the polynomal is:";
    bool h=true;
    while(t!=NULL)
    {
        if(!h) cout<<"+";
            h=false;
        if(t->ceof!=1||t->exp==0)
        cout<<t->ceof;
        switch(t->exp) //根据阶数输出相应的项
        {
            case 0:break;
            case 1:cout<<"x";break;
            default:cout<<"x^"<<t->exp;
        }
        t=t->next;
    }
    cout<<endl;
}

void insert_poly(poly *&pl,double ceof_,int exp_)
{
    poly *t,*pre,*newpoly;
    t=pl->next;pre=pl;
    while(t!=NULL&&t->exp>exp_)
    {
         pre=t;
        t=t->next;
    }
    if(t!=NULL&&t->exp==exp_)
    {
        t->ceof+=ceof_;
        if(t->ceof==0)//如果多项式系数为零,则删除
        {
            pre->next=t->next;
            delete t;
        }
    }
    else
    {
        newpoly=new poly;
        newpoly->ceof=ceof_;
        newpoly->exp=exp_;
        pre->next=newpoly;
        newpoly->next=t;
    }
}
void mul_poly(poly *&pla,poly *&plb,poly *&plc) //用插入法实现表达式相乘
{
    poly *ta,*tb;
    if(adegree!=-1&&bdegree!=-1) //没有零多项式,执行相乘运算
    {
        ta=pla->next;
        while(ta!=NULL)//模拟笔算多项式相乘
        {
            tb=plb->next;
            while(tb!=NULL)
            {
                insert_poly(plc,(ta->ceof)*(tb->ceof),ta->exp+tb->exp);
                tb=tb->next;
            }
            ta=ta->next;
        }
    }
}
int main()
{
    poly *pla,*plb,*plc;
    int i,j,_exp;
    double _ceof;
    char ch;
    int case_=0;
    while(++case_)
    {
        cout<<"case "<<case_<<":"<<endl;
        memset(A,0,sizeof(A));
        memset(B,0,sizeof(B));
        init(pla);//初始化,这个操作一定要有
        init(plb);
        init(plc);
        ch=‘0‘;
        cout<<"input A poly:";
        while(ch!=‘\n‘)//A表达式的输入
        {
            cin>>_ceof;
            getchar();getchar();
            cin>>_exp;
            ch=getchar();
            A[_exp]=_ceof;
            adegree=_exp;
        }
        input(pla,adegree,A);
        cout<<"input B poly:";
           ch=‘0‘;
        while(ch!=‘\n‘)//B表达式的输入
        {
            cin>>_ceof;
            getchar();getchar();
            cin>>_exp;
            ch=getchar();
            B[_exp]=_ceof;
            bdegree=_exp;
        }
        input(plb,bdegree,B);
        mul_poly(pla,plb,plc);
        output(plc);//输出最终结果
        cout<<"insert one formula to the poly:";
            cin>>_ceof;
            getchar();getchar();
            cin>>_exp;
        insert_poly(plc,_ceof,_exp);
        output(plc);//输出插入一项后的最终结果
        cout<<endl;
    }
}

时间: 2024-10-06 04:26:31

用插入法实现多项式的乘法的相关文章

多项式朴素乘法

某高中大佬 #include<iostream> #include<cstdio> #include<vector> using namespace std; typedef long long ll; vector<ll>A,B,C; int n,m; void Mul(){ for(int i=0;i<n+m-1;i++)C.push_back(0); for(int i=0;i<n;i++){ for(int j=0;j<m;j++)

Matlab练习——多项式和一元方程求解

1. 一元函数 f(x) = x^3 + (x - 0.98)^2 / (x + 1.25)^3 - 5 * (x + 1 / x),求f(x) = 0 的根 %在函数文件中定义函数 function y = fun(x) y = x ^ 3 + (x - 0.98) ^ 2 / (x + 1.25) ^ 3 - 5 * (x + 1 / x); end %其他文件中求解 clear; clc; a = fzero('fun',[-10,10]) 2. 求上述函数的极值 clear; clc;

多项式乘法运算终极版

在上一篇文章中 http://blog.csdn.net/acdreamers/article/details/39005227 介绍了用快速傅里叶变 换来求多项式的乘法.可以发现它是利用了单位复根的特殊性质,大大减少了运算,但是这种做法是对复数系数的矩阵 加以处理,每个复数系数的实部和虚部是一个正弦及余弦函数,因此大部分系数都是浮点数,我们必须做复数及浮点数 的计算,计算量会比较大,而且浮点数的计算可能会导致误差增大. 今天,我将来介绍另一种计算多项式乘法的算法,叫做快速数论变换(NTT),在

MATLAB多项式运算

序言 none 正文  1. 多项式的表示 在Matlab中,多项式用一个行向量表示, 行向量的元素值为多项式系数按幂次的降序排列, 如p(x)=x3-2x-5用P=[1,0,-2,-5]表示. 2. 多项式相关的函数和运算 (1) 多项式加减: 两个多项式之间的加减是对应幂次的系数进行加减, 可以直接用系数向量的加减法来得出. (2) 多项式乘法: 两个多项式的乘法用卷积函数conv来实现, 如计算多项式p1(x)=x3-2x-5和p2(x)=2x2+3x+1的积可利用如下代码: p1=[1,

多项式乘法运算初级版

快速傅里叶变换在信息学竞赛中主要用于求卷积,或者说多项式乘法.我们知道,多项式乘法的普通算法时间复杂度 是,通过快速傅里叶变换可以使时间降为,那么接下来会详细介绍快速傅里叶变换的原理. 首先来介绍多项式的两种表示方法,即系数表示法和点值表示法.从某种意义上说,这两种方法是等价的.先设 (1)系数表示法 对于一个次数界为的多项式来说,其系数表示法就是一个由系数组成的向量,很 明显,这样的多项式乘法运算的时间复杂度为. (2)点值表示法 对于一个次数界为的多项式来说,其点值是个点值对所形成的集合 其

多项式的各种运算总结(持续更新)

多项式的各种运算总结(持续更新) 多项式 多项式是个啥呢? 我们通常说的都是一元的多项式,所以一个多项式可以写成形如: \(a_ 0+a_ 1x+a_ 2x^2+a_ 3x^3......\)的式子 注意到,真正有用的是数列\(\{a_i\}\) 但是一旦我们要涉及到什么运算,就会发现对于\(\{a_i\}\)的某些运算不是特别方便. 所以我们定义生成函数\(A(x)=\sum_{i=0}^{\infty}a _ix^i\).\(A(x)\)就称为数列\(\{a _i\}\)的生成函数. 通过生

关于多项式的一些东西

泰勒展开 设\(f(x)\)在\(x_0\)处可导,且存在无穷阶导数,那么根据泰勒展开,有: \[f(x) = \sum_{i=0}^{\inf} \frac{f^{[i]}(x_0)}{i!}(x-x_0)^i + \delta\] 其中\(\delta\)是一个余项,表示一个趋近于无穷小的误差.每展开一项,误差就越小. 若\(f(x)\)在\(x_0 = 0\)处可导,带入泰勒展开式后可以得到\(f(x)\)的麦克劳林展开式: \[f(x) = \sum_{i=0}^{\inf} \frac

[复习]多项式和生成函数相关内容

[复习]多项式和生成函数相关内容 多项式 涉及的方面 主要在于多项式的乘法,也就是\(FFT,NTT,MTT\). 但是也多项式的求逆,\(exp\),\(ln\),开根,求导,积分等操作. 多项式乘法 并没有什么好复习的,记好板子就行了.同样也是多项式运算的基础. 泰勒展开&麦克劳林级数 泰勒展开: 如果\(f(x)\)在\(x0\)处存在\(n\)阶导,那么就有: \[\begin{aligned}f(x)&=f(x0)+\frac{f^1(x0)}{1!}(x-x0)+\frac{f

多项式初步

最近在看HZ的多项式视屏,感觉正如GSH所说的,多项式还挺好玩的. 多项式 多项式差不多就是初中时候学的多项式. 一个以\(x\)为变量的多项式定义在一个代数域\(F\)上,将函数\(A(x)\)表示为形式和: \(A(x)=\sum\limits_{i=0}^{n-1}a_ix^i\) 初中时常见的\(5x^2+8x+1,10x^3+8x^2-2\)就是多项式. \(a_0,a_1,...,a_{n-1}\)称为多项式的系数. 其中的数域F可以为复数域,实数域... 次数和次数界 和初中的次数