PAT 一元多項式的乘法與加法運算(20)(模擬計算過程)

一元多項式的乘法與加法運算(20)

時間限制
400 ms
內存限制
32000 kB
代碼長度限制
8000 B
判題程序
Standard

設計函數分別求兩個一元多項式的乘積與和。

輸入格式說明:

輸入分2行,每行分別先給出多項式非零項的個數,再以指數遞降方式輸入一個多項式非零項係數和指數(絕對值均爲不超過1000的整數)。數字間以空格分隔。

輸出格式說明:

輸出分2行,分別以指數遞降方式輸出乘積多項式以及和多項式非零項的係數和指數。數字間以空格分隔,但結尾不能有多餘空格。

樣例輸入與輸出:

序號 輸入 輸出
1
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 1 2 1 0
2 1 2 -1 0
1 4 -1 0
2 2
3
2 -1000 1000 1000 0
2 1000 1000 -1000 0
-1000000 2000 2000000 1000 -1000000 0
0 0
4
0
1 999 1000
0 0
999 1000

代碼(1)(普通的不嚴謹的方法,因爲沒說算式會有幾項):

#include <cstdio>
#include <cstring>

int a[1000000],b[1000000],c[1000000],d[1000000],vis[1000010];

int main (){
	int n,m,flag,num,i,j;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d %d",&a[i],&b[i]);
	scanf("%d",&m);
	for(i=1;i<=m;i++)
		scanf("%d %d",&c[i],&d[i]);
	memset(vis,0,sizeof(vis));
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			vis[b[i]+d[j]]+=a[i]*c[j];
	flag=0,num=0;
	for(i=1000000;i>=0;i--)
		if(vis[i]!=0){
			flag=1;
			if(num==1)
				printf(" %d %d",vis[i],i);
			else if(num==0){
				printf("%d %d",vis[i],i);
				num=1;
			}
		}
	if(flag==0)
		printf("0 0");
	printf("\n");
	memset(vis,0,sizeof(vis));
	for(i=1;i<=n;i++)
		vis[b[i]]+=a[i];
	for(i=1;i<=m;i++)
		vis[d[i]]+=c[i];
	flag=0,num=0;
	for(i=1000000;i>=0;i--)
		if(vis[i]!=0){
			flag=1;
			if(num==1)
				printf(" %d %d",vis[i],i);
			else if(num==0){
				printf("%d %d",vis[i],i);
				num=1;
			}
		}
	if(flag==0)
		printf("0 0");
	printf("\n");
	return 0;
}

代碼(2)(用STL做的比較合適):

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <deque>
using namespace std;

struct node 
{
	int a,b;
}w;

deque<node>ans1,ans2,a,b;

bool cmp(node a,node b){
	return a.b>b.b;
}

int main(){
	int n,i,j,k,flag;
	for(i=0;i<2;i++){
		cin>>n;
		while(n--){
			cin>>w.a>>w.b;
			if(!i)
				a.push_back(w);
			else {
				b.push_back(w);
				ans2.push_back(w);
			}
		}
	}
	for(i=0;i<a.size();i++){
		for(j=0;j<b.size();j++){
			w.a=a[i].a*b[j].a;
			w.b=a[i].b+b[j].b;
			flag=0;
			for(k=0;k<ans1.size();k++){
				if(ans1[k].b==w.b){
					ans1[k].a+=w.a;
					flag=1;
				}
			}
			if(!flag)
				ans1.push_back(w);
		}
		flag=0;
		for(j=0;j<ans2.size();j++){
			if(ans2[j].b==a[i].b){
				ans2[j].a+=a[i].a;
				flag=1;
			}
		}
		if(!flag)
			ans2.push_back(a[i]);
	}
	sort(ans1.begin(),ans1.end(),cmp);
	sort(ans2.begin(),ans2.end(),cmp);
	flag=0;
	for(i=0;i<ans1.size();i++){
		if(!flag){
			if(ans1[i].a){
				printf("%d %d",ans1[i].a,ans1[i].b);
				flag=1;
			}
		}
		else{
			if(ans1[i].a)
				printf(" %d %d",ans1[i].a,ans1[i].b);
		}
	}			
	if(!flag)
		printf("0 0\n");
	else
		printf("\n");
	flag=0;
	for(i=0;i<ans2.size();i++){
		if(!flag){
			if(ans2[i].a){
				printf("%d %d",ans2[i].a,ans2[i].b);
				flag=1;
			}
		}
		else{
			if(ans2[i].a)
				printf(" %d %d",ans2[i].a,ans2[i].b);
		}
	}			
	if(!flag)
		printf("0 0\n");
	else
		printf("\n");
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章