**
**
在这里插入代码片
C
1 2 3 4 0
1 2 3 4 0
S
X
输出结果
C(x)=0
实验二:一元多项式的基本运算
实验目的:掌握用线性表实现一元多项式的基本运算。
实验内容:使用链式存储实现一元多项式的加法、减法、乘法和求导。即:
C(x)= A(x)+B(x);C(x)= A(x)-B(x) C(x)= A(x)*B(x) C(x)= A’(x)
菜单:
1)C :分别创建两个多项式A(x)和B(x),其中 输入时按照 指数的升序顺序输入,遇到系数为0则停止。例如:输入 :
1 2 3 4 5 6 7 8
0 2 3 4 5 6 7 0 则生成的多项式分别为:
A(x)=x2+3x4+5x6+7x8
B(x)=2x3+4x5+6x^7
2)P:计算C(x)= A(x)+B(x),计算完毕后输出C(x)的 结果
3)S: 计算C(x)= A(x)-B(x),计算完毕后输出C(x)的 结果
4)M: 计算C(x)= A(x)*B(x),计算完毕后输出C(x)的 结果
5)D: 计算C(x)= A’(x),计算完毕后输出C(x)的 结果
6)V: 首先输入一个 float型数据,然后计算 A(x)并输出计算的结果。
7)C: 分别清空A(x)、B(x)、C(x)三个多项式。
8)X: 退出程序。
测试样例1`
C
1 2 3 4 5 6 7 8 0
2 3 4 5 6 7 0
S
P
M
D
V
2
X
输出结果
C(x)=x^2-2x^3+3x^4-4x^5+5x^6-6x^7+7x^8
C(x)=x^2+2x^3+3x^4+4x^5+5x^6+6x^7+7x^8
C(x)=2x^5+10x^7+28x^9+52x^11+58x^13+42x^15
C(x)=2x+12x^3+30x^5+56x^7
2164.00
测试样例2
C
2 2 0
2 2 3 3 0
P
S
M
D
V
3.1
X
输出结果
C(x)=4x^2+3x^3
C(x)=-3x^3
C(x)=4x^4+6x^5
C(x)=4x
19.22
测试样例 3
C
3 0 2 2 0
-2 2 3 3 0
M
V
2.1
P
S
D
X
输出结果
C(x)=-6x^2+9x^3-4x^4+6x^5
11.82
C(x)=3+3x^3
C(x)=3+4x^2-3x^3
C(x)=4x
这个其实就是一个暴力题,我直接用结构体存储多项式,操作都是暴力的。多项式的输出写的是真的麻烦。
1.要注意考虑第一个输出的系数为正数时不用‘+’号,不是第一个输出的正系数都要加上‘+’号。
2.当多项式的系数为1或者-1时要省略系数。直接变为x^n 或者 -x^n
3.当幂次的系数为0时 直接输出多项式的系数当作常数项。
4.当幂次的系数为1时,更改输出方式为 nx 或者 -nx ,具体情况具体分析。
其他都是暴力的操作,希望大家在看代码的时候能够先理解 然后再自己动手写,编写代码只有自己亲自动手才能变得更强。
希望大家能够顺利过题。。
更新后的AC代码
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N=1e5+7;
struct node
{
int num[N+5],sum=0;
}a,b;
int main()
{
char c;
for(int i=0;i<N;i++) a.num[i]=0;
for(int i=0;i<N;i++) b.num[i]=0;
a.sum=0;
b.sum=0;
cin>>c;
int x,y;
while(cin>>x)
{
if(x==0) break;
else
{
cin>>y;
a.num[y]=x;
a.sum=max(y,a.sum);
}
}
while(cin>>x)
{
if(x==0) break;
else
{
cin>>y;
b.num[y]=x;
b.sum=max(y,b.sum);
}
}
int flag;
while(cin>>c)
{
if(c=='P')
{
node s;
for(int i=0;i<N;i++) s.num[i]=0;
int maxn=max(a.sum,b.sum);
for(int i=0;i<=maxn;i++) s.num[i]=a.num[i]+b.num[i];
cout<<"C(x)=";
int flagg=0;
for(int i=0;i<=maxn;i++)
{
if(s.num[i]!=0)
{
flagg=1;
break;
}
}
if(flagg==0) cout<<0<<endl;
else
{
flag=0;
for(int i=0;i<=maxn;i++)
{
if(s.num[i]!=0)
{
if(flag==0)
{
flag=1;
if(s.num[i]<0)
{
if(i==0) printf("%d",s.num[i]);
else if(i==1) printf("%dx",s.num[i]);
else
{
if(s.num[i]==-1) printf("-x^%d",i);
else printf("%dx^%d",s.num[i],i);
}
}
else
{
if(i==0) printf("%d",s.num[i]);
else if(i==1) printf("%dx",s.num[i]);
else
{
if(s.num[i]==1) printf("x^%d",i);
else printf("%dx^%d",s.num[i],i);
}
}
}
else
{
if(s.num[i]<0)
{
if(i==1) printf("%dx",s.num[i]);
else
{
if(s.num[i]==-1) printf("-x^%d",i);
else printf("%dx^%d",s.num[i],i);
}
}
else
{
if(i==1) printf("+%dx",s.num[i]);
else
{
if(s.num[i]==1) printf("+x^%d",i);
else printf("+%dx^%d",s.num[i],i);
}
}
}
}
}
cout<<endl;
}
}
else if(c=='S')
{
node s;
for(int i=0;i<N;i++) s.num[i]=0;
int maxn=max(a.sum,b.sum);
for(int i=0;i<=maxn;i++) s.num[i]=a.num[i]-b.num[i];
cout<<"C(x)=";
int flagg=0;
for(int i=0;i<=maxn;i++)
{
if(s.num[i]!=0)
{
flagg=1;
break;
}
}
if(flagg==0) cout<<0<<endl;
else
{
flag=0;
for(int i=0;i<=maxn;i++)
{
if(s.num[i]!=0)
{
if(flag==0)
{
flag=1;
if(s.num[i]<0)
{
if(i==0) printf("%d",s.num[i]);
else if(i==1) printf("%dx",s.num[i]);
else
{
if(s.num[i]==-1) printf("-x^%d",i);
else printf("%dx^%d",s.num[i],i);
}
}
else
{
if(i==0) printf("%d",s.num[i]);
else if(i==1) printf("%dx",s.num[i]);
else
{
if(s.num[i]==1) printf("x^%d",i);
else printf("%dx^%d",s.num[i],i);
}
}
}
else
{
if(s.num[i]<0)
{
if(i==1) printf("%dx",s.num[i]);
else
{
if(s.num[i]==-1) printf("-x^%d",i);
else printf("%dx^%d",s.num[i],i);
}
}
else
{
if(i==1) printf("+%dx",s.num[i]);
else
{
if(s.num[i]==1) printf("+x^%d",i);
else printf("+%dx^%d",s.num[i],i);
}
}
}
}
}
cout<<endl;
}
}
else if(c=='M')
{
node s;
for(int i=0;i<N;i++) s.num[i]=0;
int cnt=a.sum*b.sum;
for(int i=0;i<=a.sum;i++)
{
for(int j=0;j<=b.sum;j++)
{
s.num[i+j]=s.num[i+j]+a.num[i]*b.num[j];
}
}
cout<<"C(x)=";
int flagg=0;
for(int i=0;i<=cnt;i++)
{
if(s.num[i]!=0)
{
flagg=1;
break;
}
}
if(flagg==0) cout<<0<<endl;
else
{
flag=0;
for(int i=0;i<=cnt;i++)
{
if(s.num[i]!=0)
{
if(flag==0)
{
flag=1;
if(s.num[i]<0)
{
if(i==0) printf("%d",s.num[i]);
else if(i==1) printf("%dx",s.num[i]);
else
{
if(s.num[i]==-1) printf("-x^%d",i);
else printf("%dx^%d",s.num[i],i);
}
}
else
{
if(i==0) printf("%d",s.num[i]);
else if(i==1) printf("%dx",s.num[i]);
else
{
if(s.num[i]==1) printf("x^%d",i);
else printf("%dx^%d",s.num[i],i);
}
}
}
else
{
if(s.num[i]<0)
{
if(i==1) printf("%dx",s.num[i]);
else
{
if(s.num[i]==-1) printf("-x^%d",i);
else printf("%dx^%d",s.num[i],i);
}
}
else
{
if(i==1) printf("+%dx",s.num[i]);
else
{
if(s.num[i]==1) printf("+x^%d",i);
else printf("+%dx^%d",s.num[i],i);
}
}
}
}
}
cout<<endl;
}
}
else if(c=='D')
{
node s;
for(int i=0;i<N;i++) s.num[i]=0;
for(int i=0;i<=a.sum-1;i++) s.num[i]=a.num[i+1]*(i+1);
cout<<"C(x)=";
int flagg=0;
for(int i=0;i<=a.sum-1;i++)
{
if(s.num[i]!=0)
{
flagg=1;
break;
}
}
if(flagg==0) cout<<0<<endl;
else
{
flag=0;
for(int i=0;i<=a.sum-1;i++)
{
if(s.num[i]!=0)
{
if(flag==0)
{
flag=1;
if(s.num[i]<0)
{
if(i==0) printf("%d",s.num[i]);
else if(i==1) printf("%dx",s.num[i]);
else
{
if(s.num[i]==-1) printf("-x^%d",i);
else printf("%dx^%d",s.num[i],i);
}
}
else
{
if(i==0) printf("%d",s.num[i]);
else if(i==1) printf("%dx",s.num[i]);
else
{
if(s.num[i]==1) printf("x^%d",i);
else printf("%dx^%d",s.num[i],i);
}
}
}
else
{
if(s.num[i]<0)
{
if(i==1) printf("%dx",s.num[i]);
else
{
if(s.num[i]==-1) printf("-x^%d",i);
else printf("%dx^%d",s.num[i],i);
}
}
else
{
if(i==1) printf("+%dx",s.num[i]);
else
{
if(s.num[i]==1) printf("+x^%d",i);
else printf("+%dx^%d",s.num[i],i);
}
}
}
}
}
cout<<endl;
}
}
else if(c=='V')
{
float t,ans=0,sz=1;
cin>>t;
for(int i=0;i<=a.sum;i++)
{
if(i!=0) sz=sz*t;
ans+=a.num[i]*sz;
}
cout<<fixed<<setprecision(2)<<ans<<endl;
}
else if(c=='C')
{
for(int i=0;i<=a.sum;i++) a.num[i]=0;
a.sum=0;
for(int i=0;i<=a.sum;i++) b.num[i]=0;
b.sum=0;
}
else if(c=='X')
{
break;
}
}
return 0;
}