设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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 <iostream>
#include <cstdlib>
using namespace std;
typedef struct PolyNode
{
int coef;
int expon;
struct PolyNode *link;
}*Polynomial;
int Compare(int e1, int e2);
void Attach(int coef, int expon, Polynomial *PtrRear);
Polynomial PolyAdd(Polynomial p1, Polynomial p2);
Polynomial PolyMul(Polynomial p1, Polynomial p2);
Polynomial MakeNew(int n);
int main()
{
int m;
int n;
Polynomial M;
Polynomial N;
Polynomial Q;
Polynomial T;
int num = 0;
cin >> m;
M = MakeNew(m);
cin >> n;
N = MakeNew(n);
T = PolyMul(M, N);
if (T == NULL)
{
cout << 0 << " " << 0;
}
else
{
while (T)
{
num++;
if (num > 1)
cout << " " << T->coef << " " << T->expon ;
else
cout << T->coef << " " << T->expon ;
T = T->link;
}
}
num = 0;
cout << endl;
Q = PolyAdd(M, N);
if (Q == NULL)
{
cout << 0 << " " << 0;
}
else
{
while (Q)
{
num++;
if (num > 1)
cout << " " << Q->coef << " " << Q->expon;
else
cout << Q->coef << " " << Q->expon;
Q = Q->link;
}
}
cout << endl;
return 0;
}
int Compare(int e1, int e2)
{
if (e1 > e2)
{
return 1;
}
if (e1 < e2)
{
return -1;
}
if (e1 == e2)
{
return 0;
}
}
void Attach(int coef, int expon, Polynomial *PtrRear)
{
Polynomial p;
p = (Polynomial)malloc(sizeof(PolyNode));
p->coef = coef;
p->expon = expon;
(*PtrRear)->link = p;
*PtrRear = p;
}
Polynomial PolyAdd(Polynomial p1, Polynomial p2)
{
Polynomial fronts;
Polynomial rear;
Polynomial temp;
int sum;
rear = (Polynomial)malloc(sizeof(PolyNode));
fronts = rear;
while (p1 && p2)
{
switch (Compare(p1->expon, p2->expon))
{
case 1:
Attach(p1->coef, p1->expon, &rear);
p1 = p1->link;
break;
case -1:
Attach(p2->coef, p2->expon, &rear);
p2 = p2->link;
break;
case 0:
sum = p1->coef + p2->coef;
if (sum)
{
Attach(sum, p1->expon, &rear);
}
p1 = p1->link;
p2 = p2->link;
break;
}
}
while (p1)
{
Attach(p1->coef, p1->expon, &rear);
p1 = p1->link;
}
while (p2)
{
Attach(p2->coef, p2->expon, &rear);
p2 = p2->link;
}
rear->link = NULL;
temp = fronts;
fronts = fronts->link;
free(temp);
return fronts;
}
Polynomial MakeNew(int n)
{
Polynomial fronts,rear,temp;
int k,c[10],e[10];
fronts=(Polynomial)malloc(sizeof(struct PolyNode));
rear=fronts;
for(k=0; k<n; k++)
{
cin>>c[k];
cin>>e[k];
Attach(c[k],e[k],&rear);
}
rear->link=NULL;
temp=fronts;
fronts=fronts->link;
free(temp);
return fronts;
}
Polynomial PolyMul(Polynomial p1, Polynomial p2)
{
Polynomial pResult = NULL;
Polynomial CopyP2 = p2;
Polynomial TmpP;
if (p1 == NULL || p2 == NULL)
{
return pResult;
}
while (p1)
{
while (p2)
{
TmpP = (Polynomial)malloc(sizeof(PolyNode));
TmpP->link = NULL;
TmpP->coef = (p1->coef)*(p2->coef);
TmpP->expon = (p1->expon)+(p2->expon);
pResult = PolyAdd(pResult, TmpP);
p2 = p2->link;
}
p2 = CopyP2;
p1 = p1->link;
}
return pResult;
}