设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
思路
这题本身并不难,但我在输出零多项式这里耗了太多时间,我还以为是指数为零系数为零项也要输出,结果做了很多无用功。。。。
其实只是多项式为零项,输出0 0就行
还有就是加法加到结果多项里的项,分析一下指数相等的情况,也就是对 Attach 更改一下
代码
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
typedef struct PolyNode* Polynomial;
struct PolyNode {
int coef;
int expon;
Polynomial link;
};
Polynomial readpoly();
Polynomial Mult(Polynomial p1, Polynomial p2);
Polynomial Add(Polynomial p1, Polynomial p2);
void Attach(int c, int e, Polynomial* pRear);
void PrintfPoly(Polynomial p);
int main()
{
Polynomial p1, p2, p3, p4;
p1 = readpoly();
p2 = readpoly();
p3 = Add(p1, p2);
p4 = Mult(p1, p2);
PrintfPoly(p4);
PrintfPoly(p3);
return 0;
}
Polynomial readpoly()
{
Polynomial p, rear;
p = (Polynomial)malloc(sizeof(struct PolyNode));
p->link = NULL;
rear = p;
int n;
scanf("%d", &n);
int coef, expon;
while (n) {
scanf("%d %d", &coef, &expon);
Attach(coef, expon, &rear);
n--;
}
return p;
}
void Attach(int c, int e, Polynomial* pRear)
{
Polynomial p;
p = (Polynomial)malloc(sizeof(struct PolyNode));
p->coef = c;
p->expon = e;
p->link = NULL;
if ((*pRear)->expon == e) {
(*pRear)->coef += c;
}
else {
(*pRear)->link = p;
*pRear = p;
}
}
void PrintfPoly(Polynomial p)
{
int flag = 0;
p = p->link;
if (!p) {
printf("0 0\n");
return;
}
while (p) {
if (!flag) {
flag = 1;
}
else {
printf(" ");
}
printf("%d %d", p->coef, p->expon);
p = p->link;
}
printf("\n");
}
Polynomial Add(Polynomial p1, Polynomial p2)
{
Polynomial p, rear;
rear = (Polynomial)malloc(sizeof(struct PolyNode));
p = rear;
p1 = p1->link;
p2 = p2->link;
while (p1 && p2) {
if (p1->expon > p2->expon) {
Attach(p1->coef, p1->expon, &rear);
p1 = p1->link;
}
else if (p1->expon < p2->expon) {
Attach(p2->coef, p2->expon, &rear);
p2 = p2->link;
}
else {
if (p1->coef + p2->coef) {
Attach(p1->coef + p2->coef, p1->expon, &rear);
}
p1 = p1->link;
p2 = p2->link;
}
}
while (p1) {
Attach(p1->coef, p1->expon, &rear);
p1 = p1->link;
}
while (p2) {
Attach(p2->coef, p2->expon, &rear);
p2 = p2->link;
}
return p;
}
Polynomial Mult(Polynomial p1, Polynomial p2)
{
Polynomial p, rear, s1, s2, temp;
p = (Polynomial)malloc(sizeof(struct PolyNode));
rear = p;
s1 = p1->link, s2 = p2->link;
if ((!p1->link) || (!p2->link)) {
p->link = NULL;
return p;
}
while (s2) {
Attach(s1->coef * s2->coef, s1->expon + s2->expon, &rear);
s2 = s2->link;
}
s1 = s1->link;
while (s1) {
rear = p;
s2 = p2->link;
while (s2) {
while (rear->link && (rear->link)->expon > (s1->expon + s2->expon))
rear = rear->link;
if (rear->link && (rear->link)->expon == (s1->expon + s2->expon)) {
if ((rear->link)->coef + (s1->coef * s2->coef)) {
(rear->link)->coef += s1->coef * s2->coef;
}
else {
temp = rear->link;
rear->link = (rear->link)->link;
free(temp);
}
}
else {
temp = (Polynomial)malloc(sizeof(struct PolyNode));
temp->coef = s1->coef * s2->coef;
temp->expon = s1->expon + s2->expon;
temp->link = rear->link;
rear->link = temp;
//rear = rear->link;
}
s2 = s2->link;
}
s1 = s1->link;
}
return p;
}