一元多项式的乘法与加法运算
题目:
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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>
int main()
{
int n, m, i, j, k, td, tD, flag=0;
scanf("%d", &n);
//A存放指数,a存放系数
int *A = (int *)malloc(n * sizeof(int));
int *a = (int *)malloc(n * sizeof(int));
for(i=0; i<n; i++)
scanf("%d %d", &A[i], &a[i]);
scanf("%d", &m);
//B存放指数,b存放系数
int *B = (int *)malloc(m * sizeof(int));
int *b = (int *)malloc(m * sizeof(int));
for(i=0; i<m; i++)
scanf("%d %d", &B[i], &b[i]);
//存放加法计算后的结果 ,C存放指数,c存放系数
int *C = (int *)malloc((m+n) * sizeof(int));
int *c = (int *)malloc((m+n) * sizeof(int));
//存放乘法计算后的结果 ,D存放指数,d存放系数
int *D = (int *)malloc((m*n) * sizeof(int));
int *d = (int *)malloc((m*n) * sizeof(int));
//乘法运算
k = 0;
for(i=0; i<n; i++)
for(j=0; j<m; j++)
{
D[k] = A[i] * B[j];
d[k] = a[i] + b[j];
k++;
}
//排序 + 合并同类项
for(i=0; i<k; i++)
for(j=i+1; j<k; j++)
{
if(d[i] < d[j])//冒泡排序法
{
td = d[i];
d[i] = d[j];
d[j] = td;
tD = D[i];
D[i] = D[j];
D[j] = tD;
}
if(d[i] == d[j])//合并同类项
{
if(D[i]+D[j])
{
D[i] = D[i] + D[j];
D[j] = 0;
}
else
{
D[i] = 0;
D[j] = 0;
}
}
}
//输出
for(i=0; i<k; i++)
if(D[i])//系数!=0才能输出内容
{
if(flag)
printf(" ");
printf("%d %d", D[i], d[i]);
flag = 1;
}
if(!flag)//flag为零多项式的标识,当flag=0,说明运算的结果为零多项式
printf("0 0");
printf("\n");
//加法运算 两一元多项式进行对比
//如果有一个一元多项式全部比较完,则另一个的剩下的系数和指数直接追加在c和C后面
i = 0, j = 0, k = 0, flag = 0;
while(i<n && j<m)
{
if(a[i] > b[j])
{
c[k] = a[i];
C[k] = A[i];
k++;
i++;
}
else if(a[i] == b[j])
{
i++;
j++;
if(A[i-1]+B[j-1])
{
c[k] = a[i-1];
C[k] = (A[i-1] + B[j-1]);
}
else
{
c[k] = 0;
C[k] = 0;
}
k++;
}
else if(a[i] < b[j])
{
c[k] = b[j];
C[k] = B[j];
k++;
j++;
}
}
if(i == n)
while(j < m)
{
c[k] = b[j];
C[k] = B[j];
j++;
k++;
}
if(j == m)
while(i<n)
{
c[k] = a[i];
C[k] = A[i];
i++;
k++;
}
for(i=0; i<k; i++)
{
if(C[i])
{
if(flag)
printf(" ");
printf("%d %d", C[i], c[i]);
flag = 1;
}
}
if(!flag)
printf("0 0");
return 0;
}