程序设计入门——C语言 第7周编程练习 1 多项式加法(5分)
第7周编程练习
依照学术诚信条款,我保证此作业是本人独立完成的。
温馨提示:
1.本次作业属于Online Judge题目,提交后由系统即时判分。
2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩。
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
时间限制:500ms内存限制:32000kb
1 #include <stdio.h> 2 int main() 3 { 4 int a[101][2], b[101][2]; 5 int i, j; 6 7 /*输入*/ 8 for (i = 0; i < 101; i++) 9 { 10 scanf("%d %d", &a[i][0], &a[i][1]); 11 if (a[i][0] == 0) /*遇0结束*/ 12 break; 13 } 14 int na = i + 1; /*a项数*/ 15 for (i = 0; i < 101; i++) 16 { 17 scanf("%d %d", &b[i][0], &b[i][1]); 18 if (b[i][0] == 0) 19 break; 20 } 21 int nb = i + 1; /*b项数*/ 22 23 //printf("\n输入调试:\n"); 24 25 //printf("na=%d,nb=%d\n", na, nb); 26 //for (i = 0; i < na; i++) 27 //{ 28 // printf("%d %d\n", a[i][0], a[i][1]); 29 //} 30 31 //for (i = 0; i < nb; i++) 32 //{ 33 // printf("%d %d\n", b[i][0], b[i][1]); 34 //} 35 36 /*比较,求和*/ 37 int c[101 * 2][2]; /*和数组*/ 38 for (i = 0; i < na; i++) 39 { 40 c[i][0] = a[i][0]; 41 c[i][1] = a[i][1]; 42 } 43 44 int nc = na; /*c项数*/ 45 int ch; /*判断用*/ 46 for (j = 0, ch = 1; j < nb; j++, ch = 1) 47 { 48 for (i = 0; i < na; i++) 49 { 50 if (b[j][0] == c[i][0]) /*幂次相同,系数相加*/ 51 { 52 c[i][1] += b[j][1]; 53 ch = 0; 54 break; 55 } 56 } 57 if (ch) /*ch=0,有相同幂次。ch=1,没有相同幂次,加到数组后面*/ 58 { 59 nc++; 60 c[nc - 1][0] = b[j][0]; 61 c[nc - 1][1] = b[j][1]; 62 } 63 } 64 65 //printf("\n求和调试:\n"); 66 67 //printf("nc=%d\n", nc); 68 //for (i = 0; i < nc; i++) 69 //{ 70 // printf("%d %d\n", c[i][0], c[i][1]); 71 //} 72 73 /*排序*/ 74 int t; 75 for (j = 0; j < nc - 1; j++) 76 for (i = 0; i < nc - 1 - j; i++) 77 if (c[i][0] < c[i + 1][0]) 78 { 79 t = c[i][0]; 80 c[i][0] = c[i + 1][0]; 81 c[i + 1][0] = t; 82 83 t = c[i][1]; 84 c[i][1] = c[i + 1][1]; 85 c[i + 1][1] = t; 86 } 87 88 //printf("\n排序调试:\n"); 89 90 //printf("c=%d\n", nc); 91 //for (i = 0; i < nc; i++) 92 //{ 93 // printf("%d %d\n", c[i][0], c[i][1]); 94 //} 95 96 /*输出*/ 97 98 /*输出第一项*/ 99 for (i = 0; i < nc; i++) /*第一个系数不为0的项*/ 100 if (c[i][1] != 0) 101 { 102 if (c[i][0] == 0) 103 printf("%d", c[i][1]); 104 else if (c[i][0] == 1 && c[i][1] == 1) 105 printf("x"); 106 else if (c[i][0] == 1 && c[i][1] == -1) 107 printf("-x"); 108 else if (c[i][0] == 1) 109 printf("%dx", c[i][1]); 110 else if (c[i][1] == -1) 111 printf("-x%d", c[i][0]); 112 else 113 printf("%dx%d", c[i][1], c[i][0]); 114 break; 115 } 116 117 int first = i; /*第一项数组位置行标*/ 118 if (i == nc) /*全为0*/ 119 printf("0"); 120 121 /*输出第二项之后*/ 122 for (i = first + 1; i < nc; i++) 123 if (c[i][1] != 0) 124 { 125 if (c[i][0] == 0) 126 printf("%+d", c[i][1]); 127 else if (c[i][0] == 1 && c[i][1] == 1) 128 printf("+x"); 129 else if (c[i][0] == 1 && c[i][1] == -1) 130 printf("-x"); 131 else if (c[i][0] == 1) 132 printf("%+dx", c[i][1]); 133 else if (c[i][1] == -1) 134 printf("-x%d", c[i][0]); 135 else 136 printf("%+dx%d", c[i][1], c[i][0]); 137 } 138 139 return 0; 140 }

浙公网安备 33010602011771号