【问题描述】(建议用链表实现)
编写一个程序实现两个一元多项式相乘。
【输入形式】
首先输入第一个多项式中系数不为0的项的系数和指数,以一个空格分隔。且该多项式中各项的指数均为0或正整数,系数和最高幂次不会超过int类型的表示范围。对于多项式 anxn +a n-1 x n-1 +......+ a1x1 + a0x0 的输入方法如下:
an n a n-1 n-1 ...... a1 1 a0 0
即相邻两个整数分别表示表达式中一项的系数和指数。在输入中只出现系数不为0的项。最后一项的指数后没有空格,只有一个回车换行符。
按照上述方式再输入第二个多项式。
【输出形式】
将运算结果输出到屏幕。将系数不为0的项按指数从高到低的顺序输出,每次输出其系数和指数,均以一个空格分隔,最后一项的指数后也可以有一个空格。
【样例输入】
10 80000 2 6000 7 300 5 10 18 0
3 6000 5 20 8 10 6 0
【样例输出】
30 86000 50 80020 80 80010 60 80000 6 12000 21 6300 10 6020 31 6010 66 6000 35 320 56 310 42 300 25 30 130 20 174 10 108 0
【样例说明】
输入的两行分别代表如下表达式:
10x^80000 + 2x^6000 + 7x^300 + 5x^10 + 18
3x^6000 + 5x^20 + 8x^10 + 6
相乘结果为:
30x^86000 + 50x^80020 + 80x^80010 + 60x^80000 + 6x^12000 + 21x^6300 + 10x^6020 + 31x^6010 + 66x^6000 + 35x^320 + 56x^310 + 42x^300 + 25x^30 + 130x^20 + 174x^10 + 108
提示:利用链表存储多项式的系数和指数。
【评分标准】
该题要求输出相乘后多项式中系数不为0的系数和指数,共有5个测试点。上传C语言文件名为multi.c。
【思路】
1.建议用链表但我选择数组模拟
2.建立结构体数组,将每一行数据的系数和幂数分别储存在结构体数组中
3.遍历相乘,将幂数相加,系数相乘,得新数据(如原两行都有n个数据,计算之后有n*n个数据)
将其存入新数组中
4.遍历新数组,将幂指数一样的数据系数相加,对于加过一次的数据可以将系数改为0来判断已经用过,再qsort排序后再输出即可
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 128
typedef struct line{
int xi;
int mi;
}line;
int cmp(const void*a,const void *b)
{
return ((struct line*)b)->mi -((struct line*)a)->mi ;//按幂指数从大到小排序
}
int main()
{ int t=0;
int x=0;
int m=0;
char ch;
line ans[MAX];
line ans2[MAX];
line ans3[MAX];
do{
scanf("%d%d%c",&ans[x].xi,&ans[x].mi,&ch);
x++;
}while(ch!='\n');//读入第一行
do{
scanf("%d%d%c",&ans2[t].xi,&ans2[t].mi,&ch);
t++;
}while(ch!='\n');//读入第二行
for(int i=0;i<x;i++)
{
for(int q=0;q<t;q++)
{
ans3[m].xi=ans[i].xi*ans2[q].xi;
ans3[m].mi=ans[i].mi+ans2[q].mi;
m++;
}
}//相乘得新数组
qsort(ans3,m,sizeof(struct line),cmp);
for(int w=0;w<m;w++)
{
for(int o=w+1;o<m;o++)
{
if(ans3[o].xi==0) continue;
if(ans3[w].mi==ans3[o].mi)
{
ans3[w].xi+=ans3[o].xi;
ans3[o].xi=0;//未使用过则先将系数相加再将后者系数置为0
}
}
}
for(int i=0;i<m;i++)
{
if(ans3[i].xi!=0)//判断系数是否为0
{
printf("%d %d ",ans3[i].xi,ans3[i].mi);
}
}
return 0;
}