您的位置:首页 > 其它

pta 一元多项式的乘法与加法运算

2018-03-19 13:21 260 查看
7-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

思路:

利用四个数组,2个装输入结果,2个装乘法和加法的结果。题目告诉了,数字不会超过1000,所以定义成1005个即可,但乘法的结果可能是原本范围的2倍,所以装乘法结果的数组要定义大一些。数据的存储采用把指数当作数组下标,系数当作数组的值,不用考虑指数为负的问题,一元多项式指数最小为0

加法:数组置0,从0到最大范围即1000循环,即把0到1000每一个下标所对应的值都相加,放到加法结果数组中,c[i] = a[i] + b[i],不用考虑该下标是否有值,在输出时判断即可。

乘法:同加法,数组置0,乘法中每一项都需要与另一个多项式的所有项相乘,因此要双重循环,外层从0到1000,内层从0到1000,结果存到乘法数组之中,例如c[i+j] += a[i] * b[j],注意此处是+=,*同时相乘是指数相加,不是相乘。*

输出:从大到小输出即可,注意只输出系数不为0的项,注意格式,同时,若结果为0,输出0 0;

不超过1000,表示最大值为1000,循环的时候一定要把1000包括进去。

参考代码:

#include <stdio.h>
#include <string.h>

//t1,t2分别为0次输入数据,t3为乘法结果,t4为加法结果
int t1[1005], t2[1005], t3[2005], t4[1005];
#define max 1000

//输出函数,arr为结果数组,range为最大范围。
void show(int *arr, int range)
{
int i;
int tag = 0;
for(i = range; i >= 0; --i)
{
if(arr[i] != 0)
{
//输出的第一项前面没有空格,通过tag进行判断。
if(tag)
{
printf(" ");
}
tag = 1;
printf("%d %d", arr[i], i);
}
}
//若最终tag为0表示没有输出过,整个结果为0,输出0 0
if(!tag)
{
printf("0 0");
}
printf("\n");
}

int main()
{
int n1, n2, i, j, a, b;
//数组置0
memset(t1, 0, sizeof(t1));
memset(t2, 0, sizeof(t2));
memset(t3, 0, sizeof(t3));
memset(t4, 0, sizeof(t4));
scanf("%d", &n1);
for(i = 0; i < n1; ++i)
{
scanf("%d%d", &a, &b);
t1[b] = a;
}
scanf("%d", &n2);
for(i = 0; i < n2; ++i)
{
scanf("%d%d", &a, &b);
t2[b] = a;
}
//计算乘法
for(i = 0; i <= max; ++i)
{
for(j = 0; j <= max; ++j)
{
t3[i + j] += t1[i] * t2[j];
}
}
//计算加法
for(i = 0; i <= max; ++i)
{
t4[i] = t1[i] + t2[i];
}
//输出
show(t3, max * 2);
show(t4, max);
return 0;
}


题目链接:https://pintia.cn/problem-sets/15/problems/710
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  pat 一元多项式