3-04. 一元多项式的乘法与加法运算(20)(ZJU_PAT 结构体)
题目链接:http://pat.zju.edu.cn/contests/ds/3-04
设计函数分别求两个一元多项式的乘积与和。
输入格式说明:
输入分2行。每行分别先给出多项式非零项的个数。再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式说明:
输出分2行。分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。
数字间以空格分隔,但结尾不能有多余空格。
例子输入与输出:
序号 | 输入 | 输出 |
1 |
4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1 |
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1 5 20 -4 4 -5 2 9 1 -2 0 |
2 |
2 1 2 1 0 2 1 2 -1 0 |
1 4 -1 0 2 2 |
3 |
2 -1000 1000 1000 0 2 1000 1000 -1000 0 |
-1000000 2000 2000000 1000 -1000000 0 0 0 |
4 |
0 1 999 1000 |
0 0 999 1000 |
代码例如以下:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int maxn = 5217; typedef struct { int x, y; int m, s; } node; node num1[maxn], num2[maxn]; node ans_mul[maxn], ans_sum[maxn]; int max1, max2, maxx; void mult() { for(int i = 0; i <= max1; i++) { for(int j = 0; j <= max2; j++) { ans_mul[i+j].m += num1[i].x*num2[j].x; } } } void sum() { for(int i = 0; i <= maxx; i++) { ans_sum[i].s += num1[i].x + num2[i].x; } } int main() { int n, m; scanf("%d",&n); int t1, t2; max1 = max2 = 0; for(int i = 0; i < n; i++) { scanf("%d %d",&t1,&t2); if(t2 > max1) max1 = t2; num1[t2].x = t1; } scanf("%d",&m); for(int i = 0; i < m; i++) { scanf("%d%d",&t1,&t2); if(t2 > max2) max2 = t2; num2[t2].x = t1; } int mul_max = max1+max2; maxx = max(max1, max2); mult(); sum(); int flag = 0; for(int i = mul_max; i >= 0; i--) { if(!ans_mul[i].m) { continue; } if(!flag) { printf("%d %d",ans_mul[i].m,i); flag = 1; } else { printf(" %d %d",ans_mul[i].m,i); } } if(!flag) { printf("0 0"); } printf("\n"); flag = 0; for(int i = maxx; i >= 0; i--) { if(!ans_sum[i].s) { continue; } if(!flag) { printf("%d %d",ans_sum[i].s,i); flag = 1; } else { printf(" %d %d",ans_sum[i].s,i); } } if(!flag) { printf("0 0"); } printf("\n"); return 0; }