7-2 一元多项式的乘法与加法运算
7-2 一元多项式的乘法与加法运算(20 分)
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0
。
输入样例:
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
思路:看到要去重首先想到了利用数组,在系数可能为负数的情况下,还是冒险试了下数组,结果题目感觉还是降了点难度。对于加法,先利用memset函数初始化加法数组add为0;然后在输入第一个多项式的时候,指数作为数组底数,系数作为数组值,输入第二个多项式的时候,依然指数作为数组底数,但是这次要用+=。对于乘法,依然初始化为0;然后利用双重循环将,两个数组的指数和作为底数,然后数组值加上两个系数乘积。至于输出的话注意不要有空格以及输出0 0的情况。(今天签到题差点过了零点😭)
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; struct Node{ int coe; int index; }a[10005], b[10005]; int main() { int add[10005], mul[10005], max1 = 0, max2 = 0; memset(add, 0, sizeof(int) * 10005); memset(mul, 0, sizeof(int) * 10005); int n1; cin >> n1; for (int i = 0; i < n1; i++){ cin >> a[i].coe >> a[i].index; if (a[i].index>max1)max1 = a[i].index; add[a[i].index] = a[i].coe; } int n2; cin >> n2; for (int i = 0; i < n2; i++){ cin >> b[i].coe >> b[i].index; if (b[i].index>max1)max1 = b[i].index; add[b[i].index] += b[i].coe; } for (int i = 0; i < n1; i++){ //进行乘法运算 for (int j = 0; j < n2; j++){ int temp = a[i].index + b[j].index; if (max2 < temp) max2 = temp; mul[temp] += a[i].coe * b[j].coe; } } int flag = 1, temp = 0; //flag用来判断是否需要输出0 0,temp用来判断是否为第一个输出解决空格问题 for (int i = max2; i >= 0;i--) if (mul[i] != 0){ if (temp==0) printf("%d %d", mul[i], i); else printf(" %d %d", mul[i], i); flag = 0; temp++; } if (flag)cout << "0 0"; cout << endl; flag = 1; temp = 0; for (int i = max1; i >= 0; i--) if (add[i] != 0){ if (temp == 0) printf("%d %d", add[i], i); else printf(" %d %d", add[i], i); flag = 0; temp++; } if (flag)cout << "0 0"; cout << endl; return 0; }