题目链接:http://pat.zju.edu.cn/contests/pat-practise/1009
这道题是前面A+B for Polynomials的升级版,求两个多项式的和,由于有前车之鉴,所以这道题我注意了结果为0的项,其实我是用了一个通用的方式来处理结果,所以提交的时候并没有被什么陷阱绊住,首先,A*B,两项系数相乘,指数相加,后面还有同样指数的项要合并,这样的处理符合逻辑但是操作起来比较麻烦,我首先算出A*B得到的最大指数是多少,存为max,然后开了一个大小为max + 1的c数组存结果,A*B时指数相加的和就是C的下标索引,这样就可以实现边乘边合并指数相同的项,而且初始化c数组中的系数项全为0,这样计算的时候得到的0项就和初始化时保持一样的状态,到最后算出C结果后,只用遍历其中的非0项,数出count,并按要求输出,即可AC。
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 typedef struct
5 {
6 int expo;//指数
7 double coef;//系数
8 }poly;
9
10 int main()
11 {
12 int k1, k2;
13 poly *a, *b;
14 int i,j;
15 int max;//能够出现的最大指数
16 poly *c;
17 int zhishu, xishu;
18 int count;
19
20 while(scanf("%d", &k1) != EOF)
21 {
22 a = (poly *)malloc(k1 * sizeof(poly));
23 for(i = 0; i < k1; i ++)
24 {
25 scanf("%d %lf", &a[i].expo, &a[i].coef);
26 }
27 scanf("%d", &k2);
28 b = (poly *)malloc(k2 * sizeof(poly));
29 for(i = 0; i < k2; i ++)
30 {
31 scanf("%d %lf", &b[i].expo, &b[i].coef);
32 }
33 max = a[0].expo + b[0].expo;
34 c = (poly *)malloc((max + 1) * sizeof(poly));
35 for(i = 0; i <= max; i ++)
36 {
37 c[i].expo = i;
38 c[i].coef = 0;
39 }//初始化结果
40 for(i = 0; i < k1; i ++)
41 {
42 for(j = 0; j < k2; j ++)
43 {
44 zhishu = a[i].expo + b[j].expo;
45 c[zhishu].coef += a[i].coef * b[j].coef;
46 }
47 }
48 count = 0;
49 for(i = 0; i <= max; i ++)
50 {
51 if(c[i].coef != 0)
52 {
53 count ++;
54 }
55 }
56 printf("%d", count);
57 for(i = max; i >= 0; i --)
58 {
59 if(c[i].coef != 0)
60 {
61 printf(" %d %.1lf", i, c[i].coef);
62 }
63 }
64 printf("\n");
65 }
66 return 0;
67 }