想了好久,在csdn借鉴了其他人排序的方法,最后检测应该是都没什么问题了。
无图无真相,直接上图,考虑了幂次为0、为1以及系数为负数的情况。
题目:
多项式加法(5分)
题目内容:
一个多项式可以表达为x的各次幂与系数乘积的和,比如:
2x6+3x5+12x3+6x+20
现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。
程序要处理的幂最大为100。
输入格式: 总共要输入两个多项式,每个多项式的输入格式如下:
每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,所有的系数都是整数。第一行一定是最高幂,最后一行一定是0次幂。
注意第一行和最后一行之间不一定按照幂次降低顺序排列;如果某个幂次的系数为0,就不出现在输入数据中了;0次幂的系数为0时还是会出现在输入数据中。
输出格式:从最高幂开始依次降到0幂,如:2x6+3x5+12x3-6x+20
注意其中的x是小写字母x,而且所有的符号之间都没有空格,如果某个幂的系数为0则不需要有那项。
输入样例:
6 2
5 3
3 12
1 6
0 20
6 2
5 3
2 12
1 6
0 20
输出样例:4x6+6x5+12x3+12x2+12x+40
以下是源代码:(欢迎大家指教更简便的算法!
#include <stdio.h>
int max(int a[],int i);
int main ()
{
int a[100],b[100];
int i,cnt=0;
for (i=0;i<100;i++){
a[i]=b[i]=-1;
//printf("%d %d\n", a[i], b[i]);这里是调试了一下,看看有没有把-1存入数组
}
for(i=0;cnt<2;i++){
scanf ("%d %d", &a[i],&b[i]);
if (a[i]==0){
cnt++;//因为0次幂会出现2次,所以在它次数cnt达到2之前的所有数都要读入数组
}
}//读入数据 //printf("%d %d %d\n", a[i], b[i], cnt);
int s=i,change1,change2;//printf("%d", s);
int t=1;//这里做的是:把幂相同的系数相加,将位于后面的系数写为0
for (i=0;i<s;i++){
while (t<s){
if (a[i]==a[t]){
b[i]+=b[t];
b[t]=0;
if (a[i]==0){
a[t]=-1;}//注意a[]==0的情况要单独区分,因为我们每次输出都要根据它们的幂决定,而如果不把后一项的幂a[]定义为负数,则无法与==0的情况区分,导致幂为0的值会输出两次。
//printf("%d", a[t]);
break;
}
t++;
}
t=i+2;
}
int maxid=0;//这里是做一个排序,按照幂次数由高到低排序
while (maxid<s-1){
for (i=s-1;i>maxid;i--){
if (a[i]>a[maxid]){
change1=a[i];
change2=b[i];
a[i]=a[maxid];b[i]=b[maxid];
a[maxid]=change1;b[maxid]=change2;
}
}
maxid++;
}
int c[100][2]={0};//排序后我发现还是无法直接输出答案,因为幂次相同的第二项,只是b[]==0,但是幂次并没有为0。所以我的解决方法是再用第三个数组,二维数组c把所有b[]不为0的数值录入进去,c[][1]就是a[],c[][2]是b[]的值。
for (i=0,t=0;i<s;i++){
if (b[i]!=0){
c[t][1]=a[i];
c[t][2]=b[i];
t++;
}
}
/*for(i=0;i<t;i++){
printf("%d %d\n",c[i][1], c[i][2]);}*/
for (i=0;i<t;i++){
if (c[i][1]==1){
printf("%dx", c[i][2]);
} else if (c[i][1]==0){
printf("%d", c[i][2]);
} else {
printf("%dx%d", c[i][2],c[i][1]);
}
if (i<t-1){
if (c[i+1][2]>=0){
printf("+"); //最后输出的时候,直接带+-不好写,不如重新做一个判断,并且要注意在最后一项之后是不用输出+、-号的,而如果系数是负数,会自带一个-,所以我们只要让正且非最后一个系数后面带一个+即可。
}
}
}
return 0;
}