设计函数分别求两个一元多项式的乘积与和。
输入:
两行 每一行都一样
系数,指数:绝对值不超过1000的整数
多项式非零项个数 非零系数 前一个系数对应的指数
输出:
按输入方式输出
如果是0多项式 输出0 0
结尾不能有多余空格
#include <iostream>
#include <vector>
using namespace std;
void print(int max,int a[]){
//若结果为0 输出0 0
int flag = 0;
for(int i = max; i >=0; --i){
if(a[i]){
if(flag++)
printf(" %d %d",a[i],i);
else
printf("%d %d",a[i],i);
}
}
if(!flag){
printf("0 0");
}
}
int main (){
int m,n;//读取两个的长度
int exp,cof;
int x[1001]={0},v[1001]={0};
int a[2001]={0};
int _a[1001]={0};
scanf("%d",&m);
for(int i = 0;i<m;++i){
scanf("%d",&cof);
scanf("%d",&exp);
x[exp]=cof;
}
scanf("%d",&n);
for(int i = 0;i<n;++i){//读取多项式
scanf("%d",&cof);
scanf("%d",&exp);
v[exp]=cof;
}
for(int i = 0;i<1001;++i){//多项式乘法
for(int j = 0; j < 1001;++j){
a[i+j] += x[i]*v[j];
}
}
print(2000,a);//输出乘法多项式
for(int i = 0; i < 1001;++i){//多项式加法
_a[i] += x[i];
}
for(int i = 0; i< 1001;++i){
_a[i] += v[i];
}
printf("\n");
print(1000,_a);//输出加法多项式
return 0;
}
第一步
对于题目进行分析,应该采取怎样的数据结构。
对于多项式,一般有两种,一种链式,一种顺序。
数组形式的多项式的缺点是大小不能确定,存放多元多项式不方便,但是优点是不需要考虑合并同类项这个操作。对于链式,优点是放多元多项式方便,但是合并同类项不方便,每次需要多做判断,代码上写起来不方便。
对于具体的这题,由于给出了系数与指数的范围,采取数组形式的多项式是优于链式的。
第二步
异常情况考虑。
同类项的抵消:依据存储形式已经解决
输入有0多项式的情况:依据存储形式解决
取到最大值:数组大小的问题
第三步:
编程,为将要使用的变量给予合适的定义和大小。
输出格式控制。
第四步:
提交
给出我自己测试我的代码的数据:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
结果:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
0
3 2 2 2 1 2 0
输出
0 0
2 2 2 1 2 0
2 2 1 3 0
3 2 2 -2 1 -3 0
输出
4 3 2 2 -12 1 -9 0
2 2