PTA (Advanced Level)1009 Product of Polynomials
Product of Polynomials (25 分)
This time, you are supposed to find A×B where A and B are two polynomials.
Input Specification:
Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial:
K N?1?? a?N?1???? N?2?? a?N?2???? ... N?K?? a?N?K????
where K is the number of nonzero terms in the polynomial, N?i?? and a?N?i???? (i=1,2,?,K) are the exponents and coefficients, respectively. It is given that 1≤K≤10, 0≤N?K??<?<N?2??<N?1??≤1000.
Output Specification:
For each test case you should output the product of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate up to 1 decimal place.
Sample Input:
2 1 2.4 0 3.2
2 2 1.5 1 0.5
Sample Output:
3 3 3.6 2 6.0 1 1.6
解題思路:
本題考查多項式乘法,給出兩行數組,分別為第一個多項式與第二個多項式的信息,每行第一個數n為當前多項式項數,之後給出n組數據每組包括一個整數為對應項的指數,一個浮點數為對應項的系數,要求輸出兩多項式相乘後的項數,以及以指數從大到小輸出每項的指數與系數。
這裏用了三個double型的數組ans、pol1、pol2以指數為下標記錄多項式的系數,pol1、pol2記錄給出多項式的系數,ans記錄答案多項式的系數。遍歷兩個多項式的指數,將第一個多項式的每一項都與第二個多項式相乘將結果記錄在ans數組中。
由小到大遍歷ans數組獲得系數非0項的數量,利用棧後進先出的特性,用兩個棧記錄答案數組所有系數非0項的指數與系數,之後輸出獲得的數量,與棧中的數據即可。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1e4; 4 double pol1[maxn]; //記錄第一個多項式 5 double pol2[maxn]; //記錄第二個多項式 6 double ans[maxn]; //記錄答案 7 int n1, n2; //給出的兩個多項式的項數 8 int main(){ 9 while(scanf("%d", &n1) != EOF){ //輸入第一個多項式項數 10 fill(pol1, pol1 + maxn, 0.0); 11 fill(pol2, pol2 + maxn, 0.0); 12 fill(ans, ans + maxn, 0.0); 13 //將三個數組都初始化為0 14 int temp; 15 double num; 16 int max1 = 0, max2 = 0; 17 //記錄第一個多項式與第二個多項式的最大指數 18 while(n1--){ 19 scanf("%d%lf", &temp, &num); //輸入第一個多項式每一項的指數與系數 20 pol1[temp] = num; //以指數為下標記錄系數 21 max1 = max(temp, max1); //記錄最大指數 22 } 23 scanf("%d", &n2); //輸入第二個多項式項數 24 while(n2--){ 25 scanf("%d%lf", &temp, &num); //輸入第二個多項式每一項的指數與系數 26 pol2[temp] = num; //以指數為下標記錄系數 27 max2 = max(max2, temp); //記錄最大指數 28 } 29 for(int i = 0; i <= max1; i++){ //遍歷第一個多項式的所有指數 30 for(int j = 0; j <= max2; j++){ //遍歷第二個多項式的所有指數 31 if(pol1[i] != 0 && pol2[j] != 0){ //當前相乘的項系數都不為0執行乘法運算 32 ans[i + j] += pol1[i] * pol2[j]; //指數相加系數相乘,結束後加入ans對應項 33 } 34 } 35 } 36 int cnt = 0; //cnt記錄答案項數 37 stack<int> p; //p記錄指數 38 stack<double> d; //d記錄系數 39 for(int i = 0; i <= max1 + max2; i++){ //答案中指數最大為給出的兩多項式最大指數相乘 40 if(ans[i] != 0.0){ //對應項系數不為0 41 cnt++; //項數加一 42 p.push(i); //指數入棧 43 d.push(ans[i]); //系數入棧 44 } 45 } 46 printf("%d", cnt); //輸出答案項數 47 while(!p.empty()){ //指數由大到小輸出每一項指數與系數 48 printf(" %d %.1f", p.top(), d.top()); 49 p.pop(); 50 d.pop(); 51 } 52 printf("\n"); 53 } 54 return 0; 55 }
PTA (Advanced Level)1009 Product of Polynomials