PTA-7-2 一元多项式的乘法与加法运算

本体的思路就是模拟多项式的乘法,题目描述如下:

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

输入格式:

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

对于这个题目,我一开始理解错误了题意,经过查阅才知道,这个题目的意思是想要求出

3x4-5x2+6x-25x20-7x4+3x 的乘积(汗,原谅我的理解能力)。

我们可以采用两个数组来保存指数对应的系数,也就是说 对于一个多项式,我们可以使用 num[1000] 来代表一个多项式,其中 num[4] = 6 就代表 6x4,当系数为 0 的时候,这个时候的对应位置的系数就为 0。

所以我们只需要模拟出多项式的乘法和加法即可(这里的count是用来保存有多少个不为 0 的项的):

  • 乘法:系数相乘,指数相加
    int count1 = 0;
    for (int i = 1000; i >= 0; i--)
    { // 如果 num1 的指数为 i 时系数为 0 则跳过
        if (num1[i] == 0)
            continue;
        for (int j = 1000; j >= 0; j--)
        {
            if (num2[j] == 0)
                continue;                     // 如果 num2 的指数为 i 时系数为 0 则跳过
            ans1[i + j] += num1[i] * num2[j]; // 系数相乘,指数相加
        }
    }
  • 加法:指数相同的项系数相加
int count;    
for (int i = 1000; i >= 0; i--)
    {
        if (num1[i] == 0 && num2[i] == 0)
            continue;                // 只有当二者都为 0 的时候才跳过
        ans2[i] = num1[i] + num2[i]; // 系数相加
        if (ans2[i] != 0)
            count++;
    }

所以我们就可以通过模拟来计算出两个多项式的乘积和加法:

完整代码如下:

/*
    Author: Veeupup
    一元多项式的乘法和加法运算

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

    输入:
        输入分2行,每行分别先给出多项式非零项的个数,
        再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)
        数字间以空格分隔。

    输出格式可以使用 flag 来使用,而不是通过计数来实现

 */
#include <iostream>
#include <cstdio>
#include <cstdint>
using namespace std;
typedef long long ll;

const int maxn = 2010; // 1000 * 1000 = 1e6

// 数字1 数字2 乘积结果 和结果, 设置为 ll 避免溢出
// 系数都初始化为 0
ll num1[maxn] = {0}, num2[maxn] = {0}, ans1[maxn] = {0}, ans2[maxn] = {0};

// 乘法法则
// 指数相加,系数相乘
void multiply()
{
    int count1 = 0;
    for (int i = 1000; i >= 0; i--)
    { // 如果 num1 的指数为 i 时系数为 0 则跳过
        if (num1[i] == 0)
            continue;
        for (int j = 1000; j >= 0; j--)
        {
            if (num2[j] == 0)
                continue;                     // 如果 num2 的指数为 i 时系数为 0 则跳过
            ans1[i + j] += num1[i] * num2[j]; // 系数相乘,指数相加
        }
    }
    int flag = 0;
    for (int i = maxn; i >= 0; i--)
    {
        if (ans1[i] == 0)
            continue;
        if(flag) {
            printf(" %d %d", ans1[i], i);
            flag++;
        }else {
            printf("%d %d", ans1[i], i);
            flag++;
        }
    }
    if (flag == 0)
    { // 如果全部为 0
        printf("0 0");
    }
    printf("\n");
}

// 加法法则
// 指数相同的系统相加减
void add()
{
    int count = 0;
    for (int i = 1000; i >= 0; i--)
    {
        if (num1[i] == 0 && num2[i] == 0)
            continue;                // 只有当二者都为 0 的时候才跳过
        ans2[i] = num1[i] + num2[i]; // 系数相加
        if (ans2[i] != 0)
            count++;
    }
    int flag = 0;
    for (int i = 1000; i >= 0; i--)
    {
        if (ans2[i] == 0)
            continue;
        if(flag) {
            printf(" %d %d", ans2[i], i);
            flag++;
        }else {
            printf("%d %d", ans2[i], i);
            flag++;
        }
    }
    if(flag == 0) {
        printf("0 0");
    }
}

int main()
{
    freopen("data.txt", "r", stdin);
    int n;
    scanf("%d", &n);
    int factor, expo;
    for (int i = 0; i < n; i++)
    {
        scanf("%d%d", &factor, &expo);
        num1[expo] += factor; // 指数为 expo 的系数为 factor
    }
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d%d", &factor, &expo);
        num2[expo] += factor; // 指数为 expo 的系数为 factor
    }
    multiply();
    add();
    return 0;
}

希望对大家有帮助。

posted @ 2020-03-29 15:33  南风sa  阅读(...)  评论(...编辑  收藏