PAT甲级_1009(Product of Polynomials)

1009 多项式乘积

这次,你应该求出多项式A和B的乘积(A*B)

输入规范

每个输入文件包含一个测试用例。每个测试用例占行,每行包含一个多项式的信息:
K N1 aN1 N2 aN2 … NK aNK
其中K表示多项式中非零项的个数,Ni和aNi(i = 1, 2, 3, …, K)分别表示指数和系数。它们的范围位1 <= K <= 10, 0 <= NK < … < N2 < N1 <= 1000。

输出规范

对于每个测试用例,你应该按照输入的格式在一行中输出A和B的乘积。注意一行的末尾没有多余的空格。请保留小数点后一位。

输入样例
2 1 2.4 0 3.2
2 2 1.5 1 0.5
输出样例
3 3 3.6 2 6.0 1 1.6
解题思路

模拟多项式计算过程。需要注意的是给定的多项式指数不超过1000,但是求解A*B时指数相加,答案应该时不超过2000。所以开答案数组应该开到2000大小。

AC代码
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 1005;
pair<int, double> p[MAXN];  //保存第一个多项式
double res[MAXN];       //保存答案,res[i]表示系数为i的指数
int main() {
    //输入第一个多项式
    int k1;
    cin >> k1;
    for(int i = 0; i < k1; i++) {
        cin >> p[i].first >> p[i].second;
    }
    
    //输入第二个多项式
    int k2;
    cin >> k2;
    for(int i = 0; i < k2; i++) {
        int n;
        double a;
        cin >> n >> a;
        //求解
        for(int j = 0; j < k1; j++) {
            res[p[j].first+n] += a * p[j].second;
        }
    }
    
    int cnt = 0;
    for(int i = 0; i < MAXN; i++) {
        if(res[i] != 0) {
            cnt++;
        }
    }
    if(!cnt) {
        cout << cnt << endl;
    }else {
        cout << cnt;
        for(int i = MAXN - 1; i >= 0; i--) {
            if(res[i] != 0) {
                printf(" %d %.1lf", i, res[i]);
            }
        }
        cout << endl;   
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章