前言
此题适用于翁恺老师的C语言程序设计数组编程题部分。网上关于这道题发布的代码大部分错误很多,有的人发出来的代码提交上去就直接Wrong Answer,还有的尽管可以Accept,但仅仅是通过了测试样例,实际测试中还仍存在诸多问题。下就将自己做的代码分享出来,水平有限,如仍有谬误还请指正。
题目内容
一个多项式可以表达为x的各次幂与系数乘积的和,比如:
2x6+3x5+12x3+6x+20
现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。
程序要处理的幂最大为100。
输入格式
总共要输入两个多项式,每个多项式的输入格式如下:
每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,所有的系数都是整数。第一行一定是最高幂,最后一行一定是0次幂。
注意第一行和最后一行之间不一定按照幂次降低顺序排列;如果某个幂次的系数为0,就不出现在输入数据中了;0次幂的系数为0时还是会出现在输入数据中。
输出格式
从最高幂开始依次降到0幂,如:
2x6+3x5+12x3-6x+20
注意其中的x是小写字母x,而且所有的符号之间都没有空格,如果某个幂的系数为0则不需要有那项。
程序
#include<stdio.h>
#include<math.h>
const int INF=0x7fffffff;//INF为无穷大
int main(){
int num[105]={0},max_index=-INF;//num下标存储的是幂,num存储的是多项式的系数
//输入每一项的系数和幂
for(int i=0;i<2;i++){//i代表第几个多项式
int t1,t2;//t1是每一个项的幂,t2是每一个项的系数
while(scanf("%d %d",&t1,&t2)){
num[t1]+=t2;//这步实现多项式的加法,即系数相加
if(max_index<t1)
max_index=t1;//找出最大的幂,下面逆序输出的时候用
if(t1==0)
break;
}
}
int flag=0,flag_0=0;//flag标记在要输出的一系列项中是否有值不为0的,flag_0标记是否输出过0
//从最大的幂开始,倒叙输出每一项
for(int i=max_index;i>=0;i--){
if(num[i]){
if(flag&&num[i]>0)
printf("+");
if(num[i]<0)
printf("-");//第一步先确定符号的输入输出
if(i==0)
printf("%d",abs(num[i]));
else if(num[i]==1||num[i]==-1){
if(i==1)
printf("x",i);
else
printf("x%d",i);
}//这里特殊处理
else if(i==1)
printf("%dx",abs(num[i]));
else
printf("%dx%d",abs(num[i]),i);//第二步分四种情况进行输出幂和系数
flag=1;
}
else{
if(i==max_index&&i==0){
flag_0=1;
printf("0");
}
}
}
if(!flag&&!flag_0)//如果num中所有的值为0,并且没有输出过0
printf("0");
return 0;
}