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

1、解决测试样例
我的思路呢是声明一个结构体,即包含系数coe,也包含指数index,用num1和num2两个结构体数组保存原始数据,使用result_1保存乘法数据,result_2保存加法数据
2、结果为零多项式
如果最终result_1或者result_2的长度是0,那么就输出来“0 0 ”就是了
3、合并同类项以后有的x的系数为0
做法是在打印result的时候,如果某个节点的coe为0,那么直接跳过就好了。可能出现一种情况,就是最终的结果result的第一个节点的coe为0,且长度为1,这个时候程序判断了长度不为0,此时的print函数是不会输出任何东西的,但是应该输出“0 0”才对。

void print(Num num[], int len){
if(len){ //if the result exist
for (int i = 0; i < len; i++){
if(num[i].coe == 0){
continue;
}
if(i==0){
cout << num[i].coe << " " << num[i].index;
}
else{
cout << " " << num[i].coe << " " << num[i].index;
}
}
}else{ //if the result is not exist
cout << "0 0";
return;
}

}

所以,在我们print(result)之前呢,一定要保证result第一个节点的coe不是0,如果第一个节点的coe是0,那我们就应该让后面的节点往前移动,舍去原本的第一个节点,长度减少一,如下所示。

void correct(Num Result[], int len, int tag){
for (int i = 0; i < len; i++){
if (Result[i].coe == 0){
if(tag==1){
for (int j = 0; j < k1-1; j++){
result_1[j].coe = result_1[j+1].coe;
result_1[j].index = result_1[j+1].index;
}
k1--;
}else if (tag == 2){
for (int j = 0; j < k2-1; j++){
result_2[j].coe = result_2[j+1].coe;
result_2[j].index = result_2[j+1].index;
}
k2--;
}
}else{
break;
}
}
}

4、使用sort的结构体数组排序就好了

bool mycmp(Num a, Num b){return a.index > b.index;}
sort(result_1,result_1+k1, mycmp);
sort(result_2,result_2+k2, mycmp);

最后要说的是,没一道题每个人的想法都是不同的,这里面有很多小的细节读者起初可能觉得不太好想到,没关系,慢慢来,有问题打在评论区上一起讨论讨论。

#include<iostream>
#include<algorithm>

using namespace std;
const int maxn = 1005;

struct Num{
int coe;
int index;
}num1[maxn],num2[maxn],result_1[maxn],result_2[maxn];
int k1 = 0, k2 = 0;



int find(int index, Num num[], int len);
void print(Num num[], int len);
bool mycmp(Num a, Num b){return a.index > b.index;}
void correct(Num Result[], int len, int tag);

int main(){
int n1;
cin >> n1;
k2 = n1;
for (int i = 0; i < n1; i++){
int a,b;
cin >> a >> b;
result_2[i].coe = num1[i].coe = a;
result_2[i].index = num1[i].index = b;
}

int n2;
cin >> n2;
for (int i = 0; i < n2; i++){
cin >> num2[i].coe >> num2[i].index;
}

//multiplication
for (int i = 0; i < n1; i++){
for (int j = 0; j < n2; j++){
int coe = num1[i].coe * num2[j].coe;
int index = num1[i].index+num2[j].index;
int t = find(index,result_1,k1);
if(t == -1){
result_1[k1].coe = coe;
result_1[k1].index = index;
k1++;
}else{
result_1[t].coe+=coe;
}
}
}

//additon
for (int j = 0; j < n2; j++){
int coe = num2[j].coe;
int index = num2[j].index;
int t = find(index,result_2,k2);
if (t == -1){
result_2[k2].coe = coe;
result_2[k2].index = index;
k2++;
}else{
result_2[t].coe+=coe;
}
}
sort(result_1,result_1+k1, mycmp);
sort(result_2,result_2+k2, mycmp);

correct(result_1,k1,1); //make sure the first coefficient is not zero
correct(result_2,k2,2);

print(result_1,k1);
cout << endl;
print(result_2,k2);

return 0;
}

void print(Num num[], int len){
if(len){ //if the result exist
for (int i = 0; i < len; i++){
if(num[i].coe == 0){
continue;
}
if(i==0){
cout << num[i].coe << " " << num[i].index;
}
else{
cout << " " << num[i].coe << " " << num[i].index;
}
}
}else{ //if the result is not exist
cout << "0 0";
return;
}

}

int find(int index, Num num[], int len){
for (int i = 0; i < len; i++){
if(index == num[i].index){
return i;
}
}
return -1;
}
void correct(Num Result[], int len, int tag){
for (int i = 0; i < len; i++){
if (Result[i].coe == 0){
if(tag==1){
for (int j = 0; j < k1-1; j++){
result_1[j].coe = result_1[j+1].coe;
result_1[j].index = result_1[j+1].index;
}
k1--;
}else if (tag == 2){
for (int j = 0; j < k2-1; j++){
result_2[j].coe = result_2[j+1].coe;
result_2[j].index = result_2[j+1].index;
}
k2--;
}
}else{
break;
}
}
}