7-1 一元多项式的乘法与加法运算 (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
我的思路:将多项式的指数作为数组的下标,将多项式的系数存入数组中,进行相加和相乘
注意:输出0 0的条件,就是没有输出一个数,(这里可以加个计数器来判断)
AC代码如下
#include<iostream>
#include<stdio.h>
#define MAXSIZE 50000
using namespace std;
int a[MAXSIZE]= {0},b[MAXSIZE]= {0},c[MAXSIZE]= {0},d[MAXSIZE]= {0};
//初始化函数
int First()
{
for(int i=0; i<MAXSIZE; i++)
{
a[i]=0;
b[i]=0;
c[i]=0;
d[i]=0;
}
}
//加法函数
void AdditionFunction()
{
int number=0;
for(int i=0; i<50000; i++)
{
if(a[i])
{
c[i]+=a[i];
}
if(b[i])
{
c[i]+=b[i];
}
}
for(int i=50000-1; i>=0; i--)
{
if(c[i])
{
if(number)
printf(" ");
printf("%d %d",c[i],i);
number++;
}
}
if(!number)
printf("0 0");
printf("\n");
}
//乘法函数
void MultiplicationFunction()
{
int number=0;
for(int i=0; i<50000; i++)
{
if(a[i])
{
for(int j=0; j<50000; j++)
{
if(b[j])
{
d[i+j]+=b[j]*a[i];
}
}
}
}
for(int i=50000-1; i>=0; i--)
{
//if(number) printf(" ");
if(d[i])
{
if(number)
printf(" ");
printf("%d %d",d[i],i);
number++;
}
}
if(!number)
printf("0 0");
printf("\n");
}
int main()
{
int n,m;
scanf("%d",&n);
int x,y;
for(int i=0; i<n; i++)
{
scanf("%d %d",&x,&y);
a[y]+=x;//此处如果用a[y]=x的话后面如果出现相同的y但x不同的同类项,就会导致前一个x被覆盖;
}
scanf("%d",&m);
for(int i=0; i<m; i++)
{
scanf("%d %d",&x,&y);
b[y]+=x;
}
MultiplicationFunction();
AdditionFunction();
}
PTA提交结果
测试点如下
有个问题是因为对数组的存储范围理解不对
即如果输出的时候i=50000,而不是50000-1,那么中间两个测试点就会错误