一元多项式的乘法与加法运算

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分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

难点在于要求幂的降序形式输出,这样就必须用键值对,将幂排序后再输出。

知识点:

map 的第一个模板参数是键类型,第二个模板参数是值类型。greater<int> 是一个仿函数,用于定义 map 的排序方式,它作用于第一个模板参数上,也就是对键进行排序

在本题中,我们希望将多项式按照指数降序排列,而指数是 map 的键,因此需要使用 greater<int> 对键进行排序,而不是值。

#include <functional> // greater 的头文件

 

step1:

int n, coef, exp;
    map<int, int, greater<int>> poly1, poly2;  // 系数-指数对,使用降序的指数
    cin >> n;
    while (n--) {
        cin >> coef >> exp;
        poly1[exp] = coef; // 指数是键,系数是值,产生了键值对。这里greater<int>表示按照键递减排序。
    }
    cin >> n;
    while (n--) {
        cin >> coef >> exp;
        poly2[exp] = coef;
    }

poly[exp] = coef 表示指数是键,系数是值。

step2:

使用新的map来存数结果多项式,product[exp] += coef 表示指数相同的话,系数就相加,也就是称完之后合并同类项

而sum在处理过程中,直接就是合并操作

 // 计算多项式乘积
    map<int, int, greater<int>> product;  // 乘积多项式
    for (auto it1 = poly1.begin(); it1 != poly1.end(); it1++) {
        for (auto it2 = poly2.begin(); it2 != poly2.end(); it2++) {
            int exp = it1->first + it2->first;  // 乘积多项式的指数
            int coef = it1->second * it2->second;  // 乘积多项式的系数
            product[exp] += coef;  // 相同指数的项系数相加
        }
    }

    // 计算多项式和
    map<int, int, greater<int>> sum;  // 和多项式
    for (auto it = poly1.begin(); it != poly1.end(); it++) {
        sum[it->first] += it->second;
    }
    for (auto it = poly2.begin(); it != poly2.end(); it++) {
        sum[it->first] += it->second;
    }

step3:输出

难点:要求最后一个不带空格,我想到了从0到倒数第二个都带空格,最后一个单独处理,但是product.end() - 1不行。

 

chat给出的解法是第一个单独处理,后面所有的输出都在前面加上空格。

 // 输出多项式乘积
    if (product.empty()) {
        cout << "0 0" << endl;
    } else {
        bool isFirst = true;
        for (auto it = product.begin(); it != product.end(); it++) {
            if (it->second != 0) {
                if (isFirst) {
                    cout << it->second << " " << it->first;
                    isFirst = false;
                } else {
                    cout << " " << it->second << " " << it->first;
                }
            }
        }
        cout << endl;
    }

// 输出多项式和
    if (sum.empty()) {
        cout << "0 0" << endl;
    } else {
        bool isFirst = true;
        for (auto it = sum.begin(); it != sum.end(); it++) {
            if (it->second != 0) {
                if (isFirst) {
                    cout << it->second << " " << it->first;
                    isFirst = false;
                } else {
                    cout << " " << it->second << " " << it->first;
                }
            }
        }
        cout << endl;
    }

总结:难点在于使用map键值对去将指数和系数关联。只有这样才能用降序表示最终结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值