设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
参考代码:
#include<stdio.h>
#include<stdlib.h>
struct NNode{
int A;//系数
int F;//指数
struct NNode* Next;
};
typedef struct NNode* ComNumber;
ComNumber Add(ComNumber a,ComNumber b);
ComNumber Mul(ComNumber a,ComNumber b);
int main()
{
int n1,n2;
ComNumber N1,N2,tail1,tail2,temp;
ComNumber AddR,MulR;
//创建两个多项式的头结点
N1=(ComNumber)malloc(sizeof(struct NNode));
N1->A=0;
N1->F=0;
N1->Next=NULL;
tail1=N1;
N2=(ComNumber)malloc(sizeof(struct NNode));
N2->A=0;
N2->F=0;
N2->Next=NULL;
tail2=N2;
//输入第一个多项式
scanf("%d",&n1);
for(int i=0;i<n1*2;i+=2)
{
temp=(ComNumber)malloc(sizeof(struct NNode));
temp->Next=NULL;
scanf("%d%d",&(temp->A),&(temp->F));
tail1->Next=temp;
tail1=tail1->Next;
}
//输入第二个多项式
scanf("%d",&n2);
for(int i=0;i<n2*2;i+=2)
{
temp=(ComNumber)malloc(sizeof(struct NNode));
temp->Next=NULL;
scanf("%d%d",&(temp->A),&(temp->F));
tail2->Next=temp;
tail2=tail2->Next;
}
//加法破坏了N1和N2,必须先计算乘法
//两个多项式求乘积
MulR=Mul(N1,N2);
//两个多项式求和
AddR=Add(N1,N2);
//输出乘积
ComNumber p1;//用于遍历结果
if(MulR->Next==NULL)
{
printf("0 0");
}
else
{
p1=MulR->Next;
printf("%d %d",p1->A,p1->F);
for(p1=p1->Next;p1!=NULL;p1=p1->Next)
{
printf(" %d %d",p1->A,p1->F);
}
}
printf("\n");
//输出和
if(AddR->Next==NULL)
{
printf("0 0");
}
else
{
p1=AddR->Next;
printf("%d %d",p1->A,p1->F);
for(p1=p1->Next;p1!=NULL;p1=p1->Next)
{
printf(" %d %d",p1->A,p1->F);
}
}
return 0;
}
ComNumber Add(ComNumber N1,ComNumber N2)
{
ComNumber tail,p1,p2,p;//tail记录和的尾,p1,p2遍历两个多项式,p用于开辟新节点
ComNumber Sum=(ComNumber)malloc(sizeof(struct NNode));
Sum->A=0;
Sum->F=0;
Sum->Next=NULL;
tail=Sum;
p1=N1->Next;
p2=N2->Next;
while(p1!=NULL&&p2!=NULL)
{
if(p1->F>p2->F)
{
tail->Next=p1;
p1=p1->Next;
tail=tail->Next;
}
else if(p1->F<p2->F)
{
tail->Next=p2;
p2=p2->Next;
tail=tail->Next;
}
else
{
if(p1->A+p2->A!=0)
{
p=(ComNumber)malloc(sizeof(struct NNode));
p->A=p1->A+p2->A;
p->F=p1->F;
tail->Next=p;
p1=p1->Next;
p2=p2->Next;
tail=tail->Next;
}
else//合并同类项时有抵消
{
p1=p1->Next;
p2=p2->Next;
}
}
}
if(p1!=NULL)
{
tail->Next=p1;
}
if(p2!=NULL)
{
tail->Next=p2;
}
return Sum;
}
//单项式乘以多项式
ComNumber SingleMul(ComNumber N1,ComNumber N2)
{
//N1位多项式,N2为单项式
ComNumber Result,tail,temp;//tail记录结果的尾,temp用于开辟空间
Result=(ComNumber)malloc(sizeof(struct NNode));
Result->A=0;
Result->F=0;
Result->Next=NULL;
tail=Result;
ComNumber p;//用于遍历多项式
p=N1->Next;
while(p!=NULL&&N2->A!=0)
{
for(;p!=NULL;p=p->Next)
{
temp=(ComNumber)malloc(sizeof(struct NNode));
temp->A=(p->A)*(N2->A);
temp->F=(p->F)+(N2->F);
temp->Next=NULL;
tail->Next=temp;
tail=tail->Next;
}
}
return Result;
}
ComNumber Mul(ComNumber N1,ComNumber N2)
{
ComNumber tail,p1,p2,p;//tail记录和的尾,p1,p2遍历两个多项式,p用于开辟新节点
ComNumber Mult=(ComNumber)malloc(sizeof(struct NNode));
Mult->A=0;
Mult->F=0;
Mult->Next=NULL;
tail=Mult;
p1=N1->Next;
p2=N2->Next;
while(p1!=NULL&&p2!=NULL)
{
for(;p1!=NULL;p1=p1->Next)
{
Mult=Add(Mult,SingleMul(N2,p1));
}
}
return Mult;
}