题目描述
一个一元多项式可以看作由若干个一元单项式按降幂排列成的线性表。请编写程序对输入的两个一元多项式求和,并输出求和的结果。
本题是附加代码模式,主函数main会自动附加在同学们提交的代码后面,请同学们在提交的时候注释掉附加代码。
附加代码如下:
输入格式
输入为两个一元多项式,每个一元多项式输入一行,按照降幂依次输入每个单项式的系数和指数,并以-1 -1作为结束。系数和指数均为整数,指数不小于0。
数据范围:每个多项式的数据项数量不超过10000
输出格式
输出为求和结果多项式,按照降幂依次输出每个单项的系数和指数,每个数值后面用一个空格隔开,输出结果多项式后换行。 系数为0的单项式不得输出——除非结果多项式就是0,则直接输出0。
输入样例 复制
2 7 3 5 12 1 6 0 -1 -1
7 5 9 4 3 0 -1 -1
输出样例 复制
2 7 10 5 9 4 12 1 9 0
代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct Node{
int r; // 系数
int e; // 指数
};
// 线性表存储一元多项式
struct List{
Node data[10000+5];
int len;
};
// 输出多项式
void PrintList(const List& list){
int i=0;
while(list.data[i].e>=0)
{
cout<<list.data[i].r;
cout<<" ";
cout<<list.data[i].e;
cout<<" ";
i++;
}
}
// 输入多项式
List InputList(){
List list;
for(int i=0;i<5000;i++)
{
cin>>list.data[i].r>>list.data[i].e;
if(list.data[i].r==-1&&list.data[i].e==-1)
{
break;
}
}
return list;
}
// 多项式求和
List add(const List& list1, const List& list2)
{
List result;
int i=0, j=0,k=0;
while (list1.data[i].r!=-1||list1.data[i].e!=-1) {
if (list1.data[i].e > list2.data[j].e) {
result.data[k++] = list1.data[i++];
} else if (list1.data[i].e < list2.data[j].e) {
result.data[k++] = list2.data[j++];
} else {
int sum = list1.data[i].r + list2.data[j].r;
if (sum != 0) {
result.data[k].r = sum;
result.data[k++].e = list1.data[i].e;
}
i++;
j++;
}
if(list2.data[j].r==-1&&list2.data[j].e==-1)
{
break;
}
}
while(list1.data[i].r!=-1||list1.data[i].e!=-1)
{
result.data[k++]=list1.data[i++];
}
while(list2.data[j].r!=-1||list2.data[j].e!=-1)
{
result.data[k++]=list1.data[j++];
}
return result;
}
int main()
{
// freopen("/config/workspace/answer/DataStructure/test.in","r",stdin);
List list1 = InputList();
List list2 = InputList();
List list = add(list1, list2);
PrintList(list);
return 0;
}