刷题笔记—A1009(多项式乘积)
题目可自行查看官网描述
思路:
1.每一个多项式用一个数组来存储,数组索引表示指数,元素值表示系数。根据题目要求,所以至少要开1001个元素大小的数组。
2.在多项式相乘可用嵌套循环来实现。注意在相乘的过程中要排除零项。
3.结果也用一个数组存储,不过该数组至少要开到2001个大小。因为极端情况是指数为1000的两项相乘。
4.输出,由于是按指数从大到小输出,所以倒叙输出即可,同样需要排除零项。同时要提前计数,即需要一个循环统计结果多项式有多少个。
代码:
#include<cstdio>
int main(){
double p1[1001]={0}; //存储第一个多项式
double p2[1001]={0}; //存储第二个多项式
double r[2001] = {0}; //用于存储结果
int n,e;
int i,j;
int count=0;
int num=0;
scanf("%d",&n);
while(n>0){
scanf("%d",&e);
scanf("%lf",&p1[e]); //读入每一个多项式的内容
n--;
}
scanf("%d",&n);
while(n>0){
scanf("%d",&e);
scanf("%lf",&p2[e]);
n--;
}
for(i=0;i<1001;i++){ //使用该嵌套循环进行乘法运算
for(j=0;j<1001;j++){
if(p1[i]*p2[j] != 0){
r[i+j] += p1[i]*p2[j];
}
}
}
for(i=0;i<2001;i++){
if(r[i] != 0)count++; //统计个数
}
if(count==0)printf("%d",count);
else{
printf("%d ",count);
for(i=2000;i>=0;i--){
if(r[i] != 0){
printf("%d ",i);
printf("%.1f",r[i]);
num++;
if(num<count)printf(" "); //在输出最后一个时,后面不需要空格
}
}
}
return 0;
}
总结:
该题主要就是考察了数组这种数据结构的应用。没有什么其他特别的地方,一步步来就好。不过要注意的是输出末尾不能有多余的空格,这个要注意,这是我第一次写的,所以最后的处理有点麻烦了。
另一种解法:(刷题笔记上的解法,比较简洁,精炼)
直接上代码:
#include<cstdio>
struct Poly{
int exp; //指数
int cof; //系数
}poly[1001]; //用于存储第一个多项式
double ans[2001]; //用于存放结果多项式
int main(){
int n,m,number-0;
scanf("%d",&n); //记录第一个多项式的项数
for(int i=0;i<n;i++){
scanf("%d %lf",&poly[i].exp,&poly[i].cof); //记录第一个多项式的指数和系数
}
scanf("%d",&m);
for(int i=0;i<m;i++){
int exp;
double cof;
scanf("%d %lf",&exp,&cof); // 第二个多项式的指数和系数
for(int j=0;j<n;j++){
ans[exp+poly[j].exp] += cof*poly[j].cof;
}
}
for(int i = 0;i <= 2000;i++){
if(ans[i] != 0.0) number++; //统计结果项数
}
printf("%d",number);
for(int i=2000;i>=0;i--){
if(ans[i] != 0.0){
printf(" %d %.1f",i,ans[i]);
}
}
return 0
}
思路分析:
该题用结构体数组存储系数和指数,第二个多项式不用另外开数组来存储,因为只需要得到最后的结果就行了。因此在进行第二次输入的时候就可以每输入一项,就与第一个多项式相乘。在乘的时候就比第一种方法好了,因为第一种方法遍历整个数组,而该方法不用。最后输出也没必要像第一种
那样那么的麻烦了。不过还是要对具体的题目仔细分析(最后的输出不能有多余的空格)