PTA03线性结构2 一元多项式的乘法与加法运算 (20分通过)
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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<stdio.h>
#include<stdlib.h>
typedef int elemtype;
struct poly
{
elemtype coef;//系数
int expo;//指数
};
struct LNode {
poly Array[1000];//
int Last;/
};
typedef LNode*List;
List Plus(List A, List B,List C);
List Mult(List A, List B, List C);
void Delete(List L, int i);
void Print(List L);
void Insert(int X,int M,List C)
{
C->Array[C->Last + 1].coef = X;
C->Array[C->Last + 1].expo = M;
C->Last++;
}
void Delete(List L, int i)
{
int j;
if (i<0 || i>L->Last)
{
printf("空表或者删除位序不对\n");
}
for (j = i; j <= L->Last; j++)
{
L->Array[j].coef = L->Array[j+1].coef;
L->Array[j].expo = L->Array[j+1].expo;
}
L->Last--;
}
int main()
{
int n1;
int n2;
List A, B, C, D;
A = (List)malloc(sizeof(LNode));
A->Last = -1;
D = (List)malloc(sizeof(LNode));
D->Last = -1;
B = (List)malloc(sizeof(LNode));
B->Last = -1;
C = (List)malloc(sizeof(LNode));
C->Last = -1;
int i;
//printf("输入多项式1的非零项的个数:\n");
scanf_s("%d", &n1);
//printf("按照指数从大到小输入对应的系数和指数:\n");
for (i = 0; i <= n1 - 1; i++)
{
scanf_s("%d %d",&A->Array[i].coef, &A->Array[i].expo);
// scanf_s("%d",&A->Array[i].expo);
A->Last++;
}
//printf("输入多项式2的非零项的个数:\n");
scanf_s("%d", &n2);
//printf("按照指数从大到小输入对应的系数和指数:\n");
for (int j= 0; j <= n2- 1; j++)
{
scanf_s("%d %d",&B->Array[j].coef, &B->Array[j].expo);
//scanf_s("%d",&B->Array[j].expo);
B->Last++;
}
Print(Mult(A, B, D));//乘法
Print(Plus(A, B, C));//加法
return 0;
//plus(a,b,c,n1,n2);
}
void Print(List L)
{
int i = 0;
if (i <= L->Last)
{
printf("%d %d", L->Array[i].coef, L->Array[i].expo);
}
for (i = 1; i <= L->Last; i++)
{
printf(" %d %d", L->Array[i].coef, L->Array[i].expo);
}
printf("\n");
}
List Plus(List A, List B, List C)
{
int i = 0;
int j = 0;
int k1, k2;
while (i <= A->Last&&j <= B->Last)
{
if (A->Array[i].expo == B->Array[j].expo)
{
k1 = A->Array[i].coef + B->Array[j].coef;
k2 = B->Array[j].expo;
if (k1 != 0)Insert(k1, k2, C);
i++;
j++;
}
else if (A->Array[i].expo > B->Array[j].expo)
{
k1 = A->Array[i].coef;
k2 = A->Array[i].expo;
Insert(k1, k2, C);
i++;
}
else if (A->Array[i].expo < B->Array[j].expo)
{
k1 = B->Array[j].coef;
k2 = B->Array[j].expo;
Insert(k1, k2, C);
j++;
}
}
if (i <= A->Last)
{
k1 = A->Array[i].coef;
k2 = A->Array[i].expo;
Insert(k1, k2, C);
i++;
}
if(j <= B->Last)
{
k1 = B->Array[j].coef;
k2 = B->Array[j].expo;
Insert(k1, k2, C);
j++;
}
return C;
}
List Mult(List A, List B, List D)
{
int i, j;
int k1, k2;
int m, n;
for (i = 0; i <= A->Last; i++)
{
for (j = 0; j <= B->Last; j++)
{
k1 = (A->Array[i].coef)*(B->Array[j].coef);//存系数
k2 = A->Array[i].expo + B->Array[j].expo;//存指数
Insert(k1, k2, D);
}
}
int max1, temp1, max2, temp2;
for (m = 0; m <= D->Last; m++)
{
for (n = m + 1; n <= D->Last; n++)
{
if (D->Array[n].expo > D->Array[m].expo)
{
temp1 = D->Array[m].expo;
temp2 = D->Array[m].coef;
D->Array[m].expo = D->Array[n].expo;
D->Array[m].coef = D->Array[n].coef;
D->Array[n].expo = temp1;
D->Array[n].coef = temp2;
}
else if (D->Array[m].expo == D->Array[n].expo)
{
D->Array[m].coef += D->Array[n].coef;
if (D->Array[m].coef == 0)
{
Delete(D, m);
}
Delete(D, n-1);
}
}
}
return D;
}