1. 程式人生 > >PTA (Advanced Level)1009 Product of Polynomials

PTA (Advanced Level)1009 Product of Polynomials

hit ase 以及 乘法 從大到小 span same top evel

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 1K10, 0N?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