#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 ****************************************************************/