原题地址
https://pta.patest.cn/pta/test/15/exam/4/question/710
5-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
/* 评测结果 时间 结果 得分 题目 编译器 用时(ms) 内存(MB) 用户 2017-07-08 15:53 答案正确 20 5-2 gcc 3 1 测试点结果 测试点 结果 得分/满分 用时(ms) 内存(MB) 测试点1 答案正确 12/12 3 1 测试点2 答案正确 4/4 2 1 测试点3 答案正确 2/2 2 1 测试点4 答案正确 2/2 1 1 框架 - 读入 - 处理 -- 处理加法 -- 处理乘法 - 输出 结构:结构数组 系数 幂数 当前下标 最大下标 量 存第一行 存第二行 存第一行第二行的和 存当前乘法结果 存之前的结果 */ #include<stdio.h> #define MAXLEN 10000 struct item{ int coefficient; int index; }; typedef struct multinomial{ struct item data[MAXLEN]; int len; }MN; MN mulA,mulB,mulSum,mulProduct; void MnCopyFirstToSecond(MN *a,MN *b) { int i,j; b->len=a->len; for(i=0;i<a->len;i++) { b->data[i].coefficient=a->data[i].coefficient; b->data[i].index=a->data[i].index; } } void CalcPlus( MN mA,MN mB,MN *mSum) { int i=0,j=0; mSum->len=0; while(i<mA.len && j<mB.len) //两个串都没结束 { if(mA.data[i].index>mB.data[j].index){ if(mA.data[i].coefficient==0){//提防0系数 i++; continue; } mSum->data[mSum->len].coefficient=mA.data[i].coefficient; mSum->data[mSum->len].index=mA.data[i].index; mSum->len++; i++; } else if(mB.data[j].index>mA.data[i].index){ if(mB.data[j].coefficient==0){//提防0系数 j++; continue; } mSum->data[mSum->len].coefficient=mB.data[j].coefficient; mSum->data[mSum->len].index=mB.data[j].index; mSum->len++; j++; } else if(mA.data[i].index==mB.data[j].index){ if(mA.data[i].coefficient+mB.data[j].coefficient==0){//考虑相加得0的情况 i++; j++; continue; } mSum->data[mSum->len].coefficient=mA.data[i].coefficient+mB.data[j].coefficient; mSum->data[mSum->len].index=mA.data[i].index; mSum->len++; i++; j++; } } while(i<mA.len){//B结束A没结束 if(mA.data[i].coefficient==0) { i++; continue; } mSum->data[mSum->len].coefficient=mA.data[i].coefficient; mSum->data[mSum->len].index=mA.data[i].index; mSum->len++; i++; } while(j<mB.len){//A结束B没结束 if(mB.data[j].coefficient==0){ j++; continue; } mSum->data[mSum->len].coefficient=mB.data[j].coefficient; mSum->data[mSum->len].index=mB.data[j].index; mSum->len++; j++; } } void CalcMultiply(MN a,MN b,MN *res) { MN currentResult,tempSum; currentResult.len=0; tempSum.len=0; int i=0,j=0; while(i<a.len){//多项式逐项相乘 while(j<b.len){ currentResult.data[currentResult.len].coefficient=a.data[i].coefficient*b.data[j].coefficient; currentResult.data[currentResult.len].index=a.data[i].index+b.data[j].index; currentResult.len++; j++; } CalcPlus(currentResult,tempSum,res); MnCopyFirstToSecond(res,&tempSum);//CalcPlus()函数中第二个参数与第三个不能相同,故把最近一次累加的结果复制到tempSum中去。 currentResult.len=0; i++; j=0; } } void GetInput() { int i; scanf("%d",&i); mulA.len=i; for(i=0;i<mulA.len;i++) scanf("%d %d",&mulA.data[i].coefficient,&mulA.data[i].index); scanf("%d",&i); mulB.len=i; for(i=0;i<mulB.len;i++) scanf("%d %d",&mulB.data[i].coefficient,&mulB.data[i].index); } void PrintResult(MN m) { if(m.len==0) { printf("0 0"); return; } int i; for (i=0;i<m.len;i++) { printf("%d %d",m.data[i].coefficient,m.data[i].index); if(i!=m.len-1) putchar(' '); } } int main() { GetInput(); CalcMultiply(mulA,mulB,&mulProduct); PrintResult(mulProduct); putchar(' '); CalcPlus(mulA,mulB,&mulSum); PrintResult(mulSum); }