02-2 线性结构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

先上一个错误的版本……第一次做的,很多都没有考虑到。

#include<iostream>
using namespace std;

struct node{
	int a;
	int n;
};
int main(){
	int x[1001];
	int N1,N2;
	int i,k;
	int flag1=0,flag2=0;
//	node ttt;
//	vector<node>x3;
	cin>>N1;
	node x1[N1];
	for(i=0;i<1001;i++){
		x[i]=0;
	}
	for(i=0;i<N1;i++){
		cin>>x1[i].a>>x1[i].n;
	}
	cin>>N2;
	node x2[N2];
	for(i=0;i<N2;i++){
		cin>>x2[i].a>>x2[i].n;
	}
    for(k=0;k<N2;k++){
    	for(i=0;i<N1;i++){
    		//if(i==N1-1&&k==N2-1) cout<<x2[k].a*x1[i].a<<" "<<x2[k].n+x1[i].n;
    		//else cout<<x2[k].a*x1[i].a<<" "<<x2[k].n+x1[i].n<<" "; 
    		x[x2[k].n+x1[i].n]+=x2[k].a*x1[i].a;
		}
	}
	int t=-1;
	for(i=0;i<1001;i++){
		if(x[i]!=0){
			t = i;
			break;
		}	
	}
	if(i==1001) flag1=1; 
	for(i=1000;i>=0;i--){
		if(x[i]!=0){
			if(i!=t){
				cout<<x[i]<<" "<<i<<" ";
			}
			else cout<<x[i]<<" "<<i;
			
		}
		if(flag1==1){
			cout<<"0 0";
		}
	}
	cout<<endl;		
	i=0; 
	k=0;
//	int flag1=0,flag2=0;
	while(i<N1||k<N2){
		if(i==N1||k==N2){
			if(i==N1){
				if(k==N2-1){
					cout<<x2[k].a<<" "<<x2[k].n;
					k++;
				}
				else{
					cout<<x2[k].a<<" "<<x2[k].n<<" ";
					k++;
				}
				
			}
			else if(k==N2){
				if(i==N1-1){
					cout<<x1[i].a<<" "<<x1[i].n;
					i++;
				}
				else{
					cout<<x1[i].a<<" "<<x1[i].n<<" ";
					i++;
				}		
			}		
		}
		else if(x1[i].n==x2[k].n){
			if(i==N1-1&&k==N2-1){
				cout<<x1[i].a+x2[k].a<<" "<<x1[i].n;
				i++;
				k++;
			}
			else {
				cout<<x1[i].a+x2[k].a<<" "<<x1[i].n<<" ";
				i++;
				k++;
			}	
		}
		else if(x1[i].n>x2[k].n){
			cout<<x1[i].a<<" "<<x1[i].n<<" ";
			i++;	
		}
		else if(x1[i].n<x2[k].n){
			cout<<x2[k].a<<" "<<x2[k].n<<" "; 
			k++;
		}
	}
    
	
	return 0;
}

后来主要参考了https://www.cnblogs.com/yuxiaoba/p/8326018.html做了一份新的。

这道题主要要考虑到零多项式的时候输出0 0,以及末尾不加空格的小技巧。

		if(s[i]){
			if(cnt){
				cout<<" ";
			}
			cout<<s[i]<<" "<<i;
			cnt++;
	   }
#include<iostream>
using namespace std;
#define N 2002
int x1[N]={0},x2[N]={0},m[N]={0},s[N]={0};
int main(){
	int i,t1,t2,k;
	int T;
	int cnt;
	cin>>T;
	for(i=0;i<T;i++){
		cin>>t1>>t2;
		x1[t2]+=t1;
	}
//	cout<<"1*"<<endl;
	cin>>T;
	for(i=0;i<T;i++){
		cin>>t1>>t2;
		x2[t2]+=t1;
	}
//	cout<<"1*"<<endl;
	for(i=0;i<N;i++){
		if(x1[i]){
			for(k=0;k<N;k++){
			    if(x2[k]){
			    	m[i+k]+=x1[i]*x2[k];
				}
		    }	
		}
	}
	for(i=N;i>=0;i--){
	    if(m[i]){
	    	if(cnt){
	    		cout<<" ";
			}
			cout<<m[i]<<" "<<i;
			cnt++;
		}
		
	}
	if(!cnt){
		cout<<"0 0";
	}
	cout<<endl;
	for(i=0;i<N;i++){
	    if(x1[i]){
	    	s[i]+=x1[i];
		}
		if(x2[i]){
			s[i]+=x2[i];
		}
	}
	cnt=0;
	for(i=N;i>=0;i--){
		if(s[i]){
			if(cnt){
				cout<<" ";
			}
			cout<<s[i]<<" "<<i;
			cnt++;
	   }
	}
	if(!cnt){
		cout<<"0 0";
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zjy997/article/details/92996394
今日推荐