#include <stdio.h>
#include <string.h>
struct ElemType{ // 定义多项式的每一项类型
int coef; // 系数
int expn; // 指数
};
int main(){
ElemType a[110], b[110], r[220]; // 定义两个多项式以及他们的结果
int lenA, lenB, lenR; // 定义多项式 a,b,r 的项数
char strA[1000], strB[1000], *tmp; // 定义用来读取多项式的字符串,待会分解为整数
int i, j;
while(gets(strA) && strlen(strA)){ // 注意判断字符串 strA 的长度,防止有空行
gets(strB); // 读入字符串 strB
lenA = lenB = lenR = 0; // 首先令各多项式的项数为 0
// 以下将字符串 a 放置到多项式 a 中
tmp = strtok(strA, " \t\n"); // 注意这里传入的是字符串 strA
while(tmp){
sscanf(tmp, "%d", &a[lenA].coef); // 从字符串中读取一个系数
tmp = strtok(NULL, " \t\n"); // 注意这里传入的是 NULL
sscanf(tmp, "%d", &a[lenA].expn); // 从字符串中读取一个指数
tmp = strtok(NULL, " \t\n");
lenA++; // 多项式项数加 1
}
// 以下将字符串 b 放置到多项式 b 中,操作类似上面的步骤
tmp = strtok(strB, " \t\n");
while(tmp){
sscanf(tmp, "%d", &b[lenB].coef);
tmp = strtok(NULL, " \t\n");
sscanf(tmp, "%d", &b[lenB].expn);
tmp = strtok(NULL, " \t\n");
lenB++;
}
// 下面是进行多项式的加法,算法类同有序序列的有序合并
i = j = 0; // 注意这里每次循环时值要赋为0,否则下次循环就值就会有问题
while(i<lenA && j<lenB){
if(a[i].expn > b[j].expn){ // 如果 a 的某一项比 b 的某一项指数高,则结果应加入 a 这一项
r[lenR].coef = a[i].coef;
r[lenR].expn = a[i].expn;
i++;
lenR++;
}else if(a[i].expn < b[j].expn){ // 如果 a 的某一项比 b 的某一项指数低,则结果应加入 b 这一项
r[lenR].coef = b[j].coef;
r[lenR].expn = b[j].expn;
j++;
lenR++;
}else if(a[i].expn == b[j].expn){ // 如果 a 的某一项和 b 的某一项指数相等,
if(a[i].coef + b[j].coef){ // 如果两项的系数和不为 0,则结果加上它们的和,否则就忽略
r[lenR].coef = a[i].coef + b[j].coef;
r[lenR].expn = a[i].expn;
lenR++;
}
i++;
j++;
}
}
// 结果加入多项式 a 中剩下的部分
while(i < lenA){
r[lenR].coef = a[i].coef;
r[lenR].expn = a[i].expn;
i++;
lenR++;
}
// 结果加入多项式 b 中剩下的部分
while(j < lenB){
r[lenR].coef = b[j].coef;
r[lenR].expn = b[j].expn;
j++;
lenR++;
}
// 显示多项式的结果
for(int i=0;i<lenR;i++){
printf("%d %d ", r[i].coef, r[i].expn);
}
// 换行
putchar('\n');
}
return 0;
}
/**************************************************************
Problem: 2141
User: admin
Language: C++
Result: Accepted
Time:9 ms
Memory:1148 kb
****************************************************************/