一.题目描述
输入两个多项式,(按照指数递增输入),输出相加和。
二.题目分析
在书中第二章节中出现了多项式相加的算法,使用链表实现的,在此简单使用结构体构造多项式的项。
三.代码
#include<stdio.h>
#define N 10
typedef struct
{
int x; //保存底数
int e; //保存指数
}Item;
int m,n,k=0;
//Item a[N],b[N],c[N];
void Add(Item *a,Item *b,Item *c)
{
int i=0,j=0;
//采用类似归并思想相加
while(i<m&&j<n)
{
if(a[i].e<b[j].e)
{
c[k].x=a[i].x;
c[k++].e=a[i++].e;
}
else if(a[i].e>b[j].e)
{
c[k].e=b[j].e;
c[k++].x=b[j++].x;
}
else
{
c[k].e=a[i++].e;
c[k++].x=b[j].x+a[j++].x;
}
}
while(i<m)
{
c[k].x=a[i].x;
c[k++].e=a[i++].e;
}
while(j<n)
{
c[k].e=b[j].e;
c[k++].x=b[j++].x;
}
}
int main()
{
int i,j;
Item a[10],b[10],c[10];
scanf("%d%d",&m,&n);
for(i=0;i<m;i++)
scanf("%d%d",&a[i].x,&a[i].e);
for(i=0;i<n;i++)
scanf("%d%d",&b[i].x,&b[i].e);
Add(a,b,c);
//the first item
i=0;
while(c[i].x==0) //当底数和为0时,不输出
{
i++;
}
if(i<k)
{
if(c[i].e==0)
printf("%d",c[i].x);
else if(c[i].e==1&&c[i].x==1)
printf("x");
else if(c[i].e==1&&c[i].x==-1)
printf("-x");
else if(c[i].e==1)
printf("%dx",c[i].x);
else if(c[i].x==1)
printf("x^%d",c[i].e);
else if(c[i].x==-1)
printf("-x^%d",c[i].e);
else if(c[i].x>0)
printf("+%dx^%d",c[i].x,c[i].e);
else
printf("%dx^%d",c[i].x,c[i].e);
}
//the other item
for(j=i+1;j<k;j++)
{
if(c[j].x==0)
continue;
if(c[j].e==0)
printf("+%d",c[j].x);
else if(c[j].e==1&&c[j].x==1)
printf("+x");
else if(c[j].e==1&&c[j].x==-1)
printf("-x");
else if(c[j].e==1)
printf("+%dx",c[j].x);
else if(c[j].x==1)
printf("+x^%d",c[j].e);
else if(c[j].x==-1)
printf("-x^%d",c[j].e);
else if(c[j].x>0)
printf("+%dx^%d",c[j].x,c[j].e);
else
printf("%dx^%d",c[j].x,c[j].e);
}
printf("\n");
return 0;
}