这是PTA的一道练习题,题目如下:
设计函数分别求两个一元多项式的乘积与和。
输入分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
原题链接:https://pintia.cn/problem-sets/null/problems/906377051055628288
参考解答:
#include
#include
typedef struct Node
{
int coef;
int ex;
struct Node *Next;
} *List;
List read(); // 读数据
List sum(List p1, List p2); // 多项式加法
List mult(List p1, List p2); // 多项式乘法
void print(List L); //打印
void attach(int c, int e, List *r); // 添加节点
int main()
{
List p1, p2, ps, pm;
p1 = read();
p2 = read();
ps = sum(p1, p2);
pm = mult(p1, p2);
print(pm);
printf("\n");
print(ps);
return 0;
}
// 读数据
List read()
{
List p, rear, t;
int N, c, e;
p = (List)malloc(sizeof(struct Node)); p->Next = NULL;
rear = p;
scanf("%d", &N);
while(N--)
{
scanf("%d%d", &c, &e);
attach(c, e, &rear);
}
t = p; p = p->Next; free(t);
return p;
}
// 添加节点
void attach(int c, int e, List *r)
{
List L = (List)malloc(sizeof(struct Node));
L->coef = c; L->ex = e; L->Next = NULL;
(*r)->Next = L; *r = L;
}
// 加法运算
List sum(List p1, List p2)
{
List p, pt1 = p1, pt2 = p2, rear, t;
p = (List)malloc(sizeof(struct Node)); p->Next = NULL;
rear = p;
while(pt1&&pt2)
{
if(pt1->ex == pt2->ex)
{
if(pt1->coef+pt2->coef != 0)
{
attach(pt1->coef+pt2->coef, pt1->ex, &rear);
}
pt1 = pt1->Next; pt2 = pt2->Next;
}else if(pt1->ex > pt2->ex)
{
attach(pt1->coef, pt1->ex, &rear);
pt1 = pt1->Next;
}else if(pt1->ex < pt2->ex)
{
attach(pt2->coef, pt2->ex, &rear);
pt2 = pt2->Next;
}
}
while(pt1)
{
attach(pt1->coef, pt1->ex, &rear);
pt1 = pt1->Next;
}
while(pt2)
{
attach(pt2->coef, pt2->ex, &rear);
pt2 = pt2->Next;
}
t = p; p = p->Next; free(t);
return p;
}
List mult(List p1, List p2)
{
List p, rear, pt1 = p1, pt2 = p2, t;
int c, e;
p = (List)malloc(sizeof(struct Node)); p->Next = NULL; rear = p;
while(pt1)
{
c = pt1->coef*pt2->coef; e = pt1->ex+pt2->ex;
attach(c, e, &rear);
pt1 = pt1->Next;
}
pt2 = pt2->Next;
while(pt2)
{
rear = p; pt1 = p1;
while(pt1)
{
c = pt1->coef*pt2->coef; e = pt1->ex+pt2->ex;
while(rear->Next!=NULL&&rear->Next->ex > e)
rear = rear->Next;
if(rear->Next != NULL&&rear->Next->ex == e)
{
if(rear->Next->coef+c)
rear->Next->coef+=c;
else
{
t = rear->Next; rear->Next = t->Next; free(t);
}
}else
{
t = (List)malloc(sizeof(struct Node));
t->coef = c; t->ex = e;
t->Next = rear->Next;
rear->Next = t;
}
pt1 = pt1->Next;
}
pt2 = pt2->Next;
}
t = p; p = p->Next; free(t);
return p;
}
void print(List L)
{
int flag = 0;
if(!L)
{
printf("0 0");
return;
}
while(L)
{
if(!flag)
flag = 1;
else
{
printf(" ");
}
printf("%d %d", L->coef, L->ex);
L = L->Next;
}
}