設計函數分別求兩個一元多項式的乘積與和。
輸入格式:
輸入分2行,每行分別先給出多項式非零項的個數,再以指數遞降方式輸入一個多項式非零項系數和指數(絕對值均為不超過1000的整數)。數字間以空格分隔。
輸出格式:
輸出分2行,分別以指數遞降方式輸出乘積多項式以及和多項式非零項的系數和指數。數字間以空格分隔,但結尾不能有多余空格。零多項式應輸出0 0
。
題意理解
算法思路:1、由上圖可看出本題中多項式加法是將指數相同的系數相加,多項式乘法是各項的系數相乘指數相加
2、一開始想的是模仿浙江大學慕課何老師用鏈表寫的,但是看了一下不僅思想比較復雜,代碼量也蠻大
有興趣可以通過此鏈接看看http://www.icourse163.org/learn/ZJU-93001?tid=1001757011
3、下面是用數組實現的,其關鍵思想是將指數為 z 的系數 x 放在數組的z位置上
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define N 10000 5 6 /*輸入分2行,每行分別先給出多項式非零項的個數,再以指數遞降方式輸入一個多項式非零項系數和指數 7 (絕對值均為不超過1000的整數)。數字間以空格分隔。 8 輸出分2行,分別以指數遞降方式輸出乘積多項式以及和多項式非零項的系數和指數。 9 數字間以空格分隔,但結尾不能有多余空格。零多項式應輸出0 0。*/ 10 int main() 11 { 12 int a[N] = {0}; 13 int b[N] = {0}; 14 int c[N] = {0}; //求積 15 int d[N] = {0}; //求和 16 int i ,j; 17 int x,z ; //系數 指數 18 int cnt=0; 19 20 scanf("%d",&i); //讀入第一個單項式 21 while( i-- ){ 22 scanf("%d %d",&x,&z); 23 a[z] += x; //指數為z的系數放在z位置上 24 } 25 26 scanf("%d",&i); //讀入第二個單項式 27 while( i-- ){ 28 scanf("%d %d",&x,&z); 29 b[z] += x; 30 } 31 32 //多項式乘法 33 for( i=N-1; i>=0; i--){ 34 35 if( a[i] ){ 36 for( j=0; j<N; j++){ 37 if( b[j]){ 38 c[ i+j ] += a[i]*b[j]; 39 } 40 } 41 } 42 } 43 44 //輸出多項式乘法結果 45 for( i=N-1; i>=0; i--){ 46 47 if( c[i] ){ 48 if( cnt ){ 49 //處理結尾不能有多余空格 50 printf(" "); 51 } 52 printf("%d %d",c[i],i); 53 cnt++; 54 } 55 } 56 if( !cnt ){ 57 printf("0 0"); 58 } 59 printf("\n"); 60 61 //多項式加法 62 for( i=N-1; i>=0; i--){ 63 if( a[i]){ 64 d[i] += a[i]; 65 } 66 } 67 for( j=N-1; j>=0; j--){ 68 if( b[j]){ 69 d[j] += b[j]; 70 } 71 } 72 73 //輸出多項式加法結果 74 cnt = 0; 75 for( i=N-1; i>=0; i--){ 76 if( d[i] ){ 77 if( cnt ){ 78 printf(" "); 79 } 80 printf("%d %d",d[i],i); 81 cnt++; 82 } 83 } 84 if(!cnt){ 85 printf("0 0"); 86 } 87 88 return 0; 89 }