设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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://blog.youkuaiyun.com/m0_37149062/article/details/104882218
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
typedef struct PNode {
int coef; //系数
int expn; //指数
struct PNode* next; //指针域
}PNode,*Polynomial;
Polynomial CreatPolyn();
Polynomial Add(Polynomial a, Polynomial b);
Polynomial Mul(Polynomial a, Polynomial b);
void Print(Polynomial L);
int main()
{
Polynomial a = CreatPolyn();
Polynomial b = CreatPolyn();
Polynomial mul = Mul(a, b);
Polynomial add = Add(a, b);
Print(mul); Print(add);
return 0;
}
Polynomial CreatPolyn()
{
int n;
Polynomial s = (Polynomial)malloc(sizeof(PNode));
s->next = NULL;//带头结点的链表
scanf("%d", &n);
if (n)
{
Polynomial m = s;
for (int i = 0; i < n; i++)
{
Polynomial p = (Polynomial)malloc(sizeof(PNode));
scanf("%d%d", &p->coef, &p->expn);
m->next = p;
m = p;
}
m->next = NULL;
}
return s;
}
Polynomial Add(Polynomial a, Polynomial b)
{
Polynomial L = (Polynomial)malloc(sizeof(PNode));
L->next = NULL;
Polynomial p1 = a->next, p2 = b->next, p3 = L;
while (p1 && p2)
{
if (p1->expn < p2->expn)
{
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
else if (p1->expn > p2->expn)
{
p3->next = p1;
p3 = p1;
p1 = p1->next;
}
else
{
if (p1->coef + p2->coef)
{
p1->coef = p1->coef + p2->coef;
p3->next = p1;
p3 = p1;
}
p1 = p1->next; p2 = p2->next;
}
}
p3->next = p1 ? p1 : p2;
return L;
}
Polynomial Mul(Polynomial a, Polynomial b)
{
Polynomial p1, p2, p3;
Polynomial L = (Polynomial)malloc(sizeof(PNode));
p1 = a->next;
p2 = b->next;
L->next = NULL;
if (p1 && p2)
{
for (p1 = a->next; p1; p1 = p1->next)
{
Polynomial Lm = (Polynomial)malloc(sizeof(PNode));
Lm->next = NULL;
p3 = Lm;
for (p2 = b->next; p2; p2 = p2->next)
{
Polynomial p4 = (Polynomial)malloc(sizeof(PNode));
p4->coef = p1->coef * p2->coef;
p4->expn = p1->expn + p2->expn;
p3->next = p4;
p3 = p4;
}
p3->next = NULL;
L = Add(L, Lm);
free(Lm);
}
}
return L;
}
void Print(Polynomial L)
{
int flag = 0;
L = L->next;
if(L)
while (L)
{
if(!flag)
printf("%d %d", L->coef, L->expn);
else
printf(" %d %d", L->coef, L->expn);
flag++;
L = L->next;
}
else
printf("0 0");
printf("\n");
}