設計函數分別求兩個一元多項式的乘積與和。
輸入格式:
輸入分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<stdio.h>
struct Poly{
int ex;
int co;
}Poly[1001];
int main(){
int a,b,A[2005]={0},B[1005]={0};
scanf("%d",&a);
int temp1,temp2;
for(int i=0;i<a;i++){
scanf("%d%d",&Poly[i].co,&Poly[i].ex);//先輸入係數,後輸入指數
B[Poly[i].ex]+=Poly[i].co; //指數作爲下標,係數作爲數組元素
}
scanf("%d",&b);
for(int i=0;i<b;i++){
scanf("%d%d",&temp1,&temp2);
B[temp2]+=temp1;
for(int j=0;j<a;j++)
A[temp2+Poly[j].ex]+=(temp1*Poly[j].co);//指數相加,係數相乘
}
int isfirst=1,haveoutput=0;//isfirst判斷是否是第一個輸出,haveoutput判斷最後是否是零多項式
for(int i=2000;i>=0;i--){
if(A[i]!=0){
if(!isfirst) printf(" %d %d",A[i],i);
if(isfirst){
isfirst=0;
printf("%d %d",A[i],i);
}
haveoutput=1; //如果執行了if語句則不是零多項式
}
}
if(!haveoutput) printf("0 0");
haveoutput=0; //重置判斷第二次輸出是否是零多項式
isfirst=1; //重置判斷第二次輸出的第一項
putchar('\n');
for(int i=1000;i>=0;i--){
if(B[i]!=0){
if(!isfirst) printf(" %d %d",B[i],i);
if(isfirst){
printf("%d %d",B[i],i);
isfirst=0;
}
haveoutput=1;
}
}
if(!haveoutput) printf("0 0");
return 0;
}