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

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过10000的整数)。数字间以空格分隔。

输出格式:

输出分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<bits/stdc++.h>
using namespace std;
#define N 10100
int a[N],b[N],c[N],d[N];//a:第一个多项式,b:第二个多项式,c:a,b乘积多项式,d:a,b和多项式  
int main()
{
	int m,n,tmp1,tmp2,count=0;//tmp1:系数,tmp2:指数 ,,count用于最后的输出格式控制
	cin>>m;
	for(int i=0;i<m;i++){
		cin>>tmp1>>tmp2;
		a[tmp2]=tmp1;//指数为数组的下标,系数为数组的值
	}
	cin>>n;
	for(int j=0;j<n;j++){
		cin>>tmp1>>tmp2;
		b[tmp2]=tmp1;
	}
	for(int i=0;i<N;i++){
		for(int j=0;j<N;j++){
			if(a[i]&&b[j]){
				c[i+j]+=a[i]*b[j];//c数组是新的空数组,算法是指数相加,系数相乘,注意是+=,
                                                   //因为有可能出现指数相同的情况 
			}	
		}
	}
	for(int i=0;i<N;i++){
		if(a[i]||b[i])
			d[i]+=b[i];//d数组是新的空数组,算法是系数相加,注意是+=
			d[i]+=a[i];
	}
	for(int k=N;k>=0;k--){
		if(c[k]){
			if(count) cout<<' '; 
			cout<<c[k]<<' '<<k;
			count++;
		}
	}
	if(count==0)
		cout<<"0 0";
	cout<<endl;
	count=0;
	for(int k=N;k>=0;k--){
		if(d[k]){
			if(count) cout<<' ';
			cout<<d[k]<<' '<<k;
			count++;
		}
	}
	if(count==0)
		cout<<"0 0";
	return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值