多项式加法(C语言)
题目内容:
一个多项式可以表达为x的各次幂与系数乘积的和,比如:
2x6+3x5+12x3+6x+20
现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。
程序要处理的幂最大为100。
输入格式:
总共要输入两个多项式,每个多项式的输入格式如下:
每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,所有的系数都是整数。第一行一定是最高幂,最后一行一定是0次幂。
注意第一行和最后一行之间不一定按照幂次降低顺序排列;如果某个幂次的系数为0,就不出现在输入数据中了;0次幂的系数为0时还是会出现在输入数据中。
输出格式:
从最高幂开始依次降到0幂,如:
2x6+3x5+12x3-6x+20
注意其中的x是小写字母x,而且所有的符号之间都没有空格,如果某个幂的系数为0则不需要有那项。
这道题目分数是5分,我第一次提交程序时只得到了1分,之后进行修改得到2分,再之后得到了3分,最后终于得到5分啦,好艰难啊~
第一个要考虑的是系数为1、-1。
第二个要考虑的是多项式加法的结果为0。
第三个就是用例4一直显示不通过,可用如下数据进行测验,
4 12
3 -6
2 2
1 1
0 2
4 -12
3 6
0 0
(这个数据来自于mooc翁恺程序设计入门——C语言讨论区)
我使用这个程序发现了自己的程序的缺陷,我是由于输出结果的第一项为正数时,依然输出了“+”而出错的。
#include <stdio.h>int main(){int i, j, num, len_arr, len_brr, len, flag, arr[101], brr[101], sum[101];for (i=0; i<101; i++){ //初始化数组元素为0 arr[i] = 0;brr[i] = 0;sum[i] = 0;}i = 0; //输入数据 用一维数组存储数据 while (1){scanf("%d", &num);scanf("%d", &arr[num]);if (i == 0){len_arr = num + 1;}i++;if (num == 0){break;}}i = 0;while (1){scanf("%d", &num);scanf("%d", &brr[num]);if (i == 0){len_brr = num + 1;}i++;if (num == 0){break;}}/*for (i=0; i<len_arr; i++){ //打印输入的数据 printf("%d ", arr[i]);}printf("\\n");for (i=0; i<len_brr; i++){printf("%d ", brr[i]);}*/len = (len_arr>=len_brr?len_arr:len_brr); //对数组求和 for (i=0; i<len; i++){sum[i] = arr[i] + brr[i];}flag = 0;for (i=len-1; i>=0; i--){ //输出数据 if (sum[i] != 0){flag++;if (i==len-1){if (sum[i] > 0){ printf("%d", sum[i]);}else{printf("-");if (sum[i] != -1){printf("%d", -sum[i]);}}}else if (i!=len-1 && sum[i]>0){if (flag != 1){printf("+");}if (sum[i] != 1){printf("%d", sum[i]);} }else if (i!=len-1 && sum[i]<0){printf("-");if (sum[i] != -1){printf("%d", -sum[i]);}if (i==0 && sum[i]==-1){printf("%d", -sum[i]);}}if (i != 0){printf("x");}if (i > 1){printf("%d", i);}}}if (flag == 0){printf("0");}return 0;
}