1. 程式人生 > >7-1 一元多項式的乘法與加法運算(20 point(s))

7-1 一元多項式的乘法與加法運算(20 point(s))

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

輸入格式:

輸入分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

code:
#include <stdio.h>
#include <string.h>
#include <math.h>
int a[2000],b[2000],ans[3000];
int na,nb;
//加法函式
void addP(){
	memset(ans,0,sizeof(ans));
	int i;
	int t = 0;
	for(i = 0; i <= 1005; i++){
		ans[i] = a[i]+b[i];//陣列直接相加即可
		if(ans[i]!=0)t++;//統計不為零的個數
	}
	if(t==0){
	   printf("0 0\n");//零多項式特例
	   return ;
	}
	int flag = 0;
	for(i = 1005; i >=0; i--){
		if(ans[i]!=0){//不為零輸出
		    if(!flag){
			   printf("%d %d",ans[i],i);
			   flag = 1;
		    }
		    else
		       printf(" %d %d",ans[i],i);
	    }
	}
	putchar('\n');
	return ;
}
//乘法函式
void multiP(){
	memset(ans,0,sizeof(ans));
	int i,j;
	int t = 0;
	for(i = 0; i < 1005; i++){
		if(a[i]!=0){
			for(j = 0; j < 1005; j++){
				if(b[j]!=0){
					ans[i+j] += a[i]*b[j]; //直接遍歷即可,注意這裡是+=不能是=,因為後面相乘可能出現同指數的不能覆蓋只能相加
					if(ans[i+j]!=0)t++;//同理
				}
			}
		}
	}
	if(t==0){
		printf("0 0\n");
		return ;//零多項式特例
	}
	int flag = 0;
	for(i = 2005; i >=0; i--){
		if(ans[i]!=0){//不為零輸出
		    if(!flag){
			   printf("%d %d",ans[i],i);
			   flag = 1;
		    }
		    else
		       printf(" %d %d",ans[i],i);
	    }
	}
	putchar('\n');
	return ;
}
int main(){
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	scanf("%d",&na);
	int i;
	int index,value;
	for(i = 0; i < na; i++){
		scanf("%d%d",&value,&index);
		a[index] = value;
	}
	scanf("%d",&nb);
	for(i = 0; i < nb; i++){
		scanf("%d%d",&value,&index);
	    b[index] = value;
	}//讀入資料,因為資料量較小,以陣列的下標作為指數,陣列值為係數
	//乘法:
	multiP();
	//加法:
	addP();
	return 0;
}