问题描述:
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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,则需要特殊处理。
参考代码:
#include<stdio.h>
#include<string.h>
struct Node {
int c, e;
}N[1005];
int A[2005]/*求积*/, B[1005]/*求和*/;
int main()
{
int n, m, flag = 0, cnt = 0;
int i, j, a, b;
scanf("%d", &n);
memset(B, 0, sizeof(B));
for(i = 0; i < n; i++)
{
scanf("%d %d", &N[i].c, &N[i].e);
B[N[i].e] += N[i].c;/*先让和等于第一个多项式*/
}
scanf("%d", &m);
for(i = 0; i < m; i++)
{
scanf("%d %d", &a, &b);
for(j = 0; j < n; j++)
{
A[N[j].e+b] += N[j].c * a;/*乘积的运算,数组存的是以指数为下标的对应系数*/
}
B[b] += a;/*加法运算,对应指数相同系数相加*/
}
for(i = 2000; i >= 0; i--)/*乘积最多指数不大于2000*/
{
if(A[i] != 0)/*系数非0则输出*/
{
flag = 1;
cnt++;
if(cnt == 1)
printf("%d %d", A[i], i);
else
printf(" %d %d", A[i], i);
}
}
if(!flag) printf("0 0");/*若无非零项,特殊处理*/
printf("\n");
flag = cnt = 0;
for(i = 1000; i >= 0; i--)/*和的指数最多1000*/
{
if(B[i])/*非零项输出*/
{
flag = 1;
cnt++;
if(cnt == 1)
printf("%d %d", B[i], i);
else
printf(" %d %d", B[i], i);
}
}
if(!flag) printf("0 0");/*同上*/
printf("\n");
}