设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。
#include<stdio.h>
#include<stdlib.h>
typedef struct poly
{
int coef;
int exp;
struct poly *next;
}POLY;
POLY *Input(POLY *p);
void Display(POLY *p);
POLY *Add(POLY *p1,POLY *p2);
void Descend(POLY *&p);
POLY *Multiply(POLY *p1,POLY *p2);
int main()
{
POLY *p1=NULL,*p2=NULL,
*sum=NULL,*mul=NULL;
int n1,n2;
p1=Input(p1);
p2=Input(p2);
mul=Multiply(p1,p2);
//printf("*******");
sum=Add(p1,p2);
//printf("\n*******");
Display(mul);
printf("\n");
Display(sum);
}
POLY *Input(POLY *p)
{
int n;
scanf("%d",&n);
p=(POLY *)malloc(sizeof(POLY));
POLY *temp=NULL,*p2=p;
for(int i=0;i<n;i++)
{
temp=(POLY *)malloc(sizeof(POLY));
temp->next=NULL;
scanf("%d",&temp->coef);
scanf("%d",&temp->exp);
p2->next=temp;
p2=p2->next;
}
return p;
}
void Display(POLY *p)
{
if(p->next->next==NULL&&p->next->coef==0)
{
printf("0 0");
}
else
{
while(p->next->next!=NULL)
{
printf("%d %d ",p->next->coef,p->next->exp);
p=p->next;
}
printf("%d %d",p->next->coef,p->next->exp);
}
}
POLY *Add(POLY *p1,POLY *p2)
{
POLY *p=NULL,*temp=NULL,*pr=NULL;
p=(POLY *)malloc(sizeof(POLY));
pr=p;
while(p1->next!=NULL||p2->next!=NULL)
{
temp=(POLY *)malloc(sizeof(POLY));
temp->next=NULL;
pr->next=temp;
if(p1->next!=NULL)
{
temp->coef=p1->next->coef;
temp->exp=p1->next->exp;
p1=p1->next;
}
else if(p2->next!=NULL)
{
temp->coef=p2->next->coef;
temp->exp=p2->next->exp;
p2=p2->next;
}
pr=pr->next;
}
//printf("****");
Descend(p);
return p;
}
void Descend(POLY *&p)
{
POLY *p1=(POLY *)malloc(sizeof(POLY));
POLY *pr=p,*temp=NULL,*pr2=p1;
while(pr->next!=NULL)
{
temp=(POLY *)malloc(sizeof(POLY));
temp->next=NULL;
pr2->next=temp;
temp->coef=pr->next->coef;
temp->exp=pr->next->exp;
pr=pr->next;
pr2=pr2->next;
}
pr=p;
pr2=p1;
POLY temp2;
while(pr2->next->next!=NULL)
{
pr=p;
while(pr->next->next!=NULL)
{
if(pr->next->exp<pr->next->next->exp)
{
temp2.coef=pr->next->coef;
temp2.exp=pr->next->exp;
pr->next->coef=pr->next->next->coef;
pr->next->exp=pr->next->next->exp;
pr->next->next->coef=temp2.coef;
pr->next->next->exp=temp2.exp;
}
pr=pr->next;
}
pr2=pr2->next;
}
pr=p;
pr2=p1;
while(pr->next!=NULL)
{
if(pr->next->coef==0&&p->next->next!=NULL)
{
pr->next=pr->next->next;
}
else
pr=pr->next;
}
pr=p;
pr2=p1;
while(pr->next->next!=NULL)
{
temp=pr->next->next;
if(pr->next->exp==pr->next->next->exp)
{
pr->next->coef=pr->next->coef+pr->next->next->coef;
pr->next->next=temp->next;
free(temp);
if(pr->next->coef==0&&p->next->next!=NULL)
{
pr->next=pr->next->next;
}
}
else
pr=pr->next;
}
}
POLY *Multiply(POLY *p1,POLY *p2)
{
POLY *p=(POLY *)malloc(sizeof(POLY));
POLY *temp=NULL,*pr=p,*p2_temp=p2;
while(p1->next!=NULL)
{
p2=p2_temp;
while(p2->next!=NULL)
{
temp=(POLY *)malloc(sizeof(POLY));
temp->coef=p1->next->coef*p2->next->coef;
temp->exp=p1->next->exp+p2->next->exp;
temp->next=NULL;
pr->next=temp;
pr=pr->next;
p2=p2->next;
}
p1=p1->next;
}
Descend(p);
return p;
}