PTA:运用顺序表实现多项式相加

本题要求输入两个一元多项式,然后输出它们的和(相加后得到的一元多项式)

输入格式:

输入一个整数n(表示输入组数),然后依次输入每一组数据:
输入一个整数A(表示多项式的项数,小于100),然后输入A对整数,每一对整数表示对应项的指数和系数。

输出格式:

对每一组输入,在一行中输出得到的一元多项式。

输入样例:

在这里给出一组输入。例如:

2
5
0 2
1 4
5 7
7 10
8 19
4
0 3
2 6
4 19
5 -9
3
0 3
4 7
8 2
3
0 -3
5 9
7 21

输出样例:

在这里给出相应的输出。例如:

5x^0+4x^1+6x^2+19x^4-2x^5+10x^7+19x^8
7x^4+9x^5+21x^7+2x^8

方法思路

  1. 输入处理:读取输入数据,包括多项式的项数及其对应的指数和系数。
  2. 存储多项式:使用数组来存储每个指数对应的系数,数组下标表示指数,数组的值表示对应项的系数。
  3. 合并多项式:将两个多项式的对应项系数相加,存储到结果数组中。
  4. 格式化输出:遍历结果数组,按指数升序输出所有非零项。特别注意处理系数为1或-1的情况,以及符号和格式的正确显示。

代码

#include <stdio.h>   // 输入输出库

#define MAX_EXP 10000 // 定义多项式指数的最大值

int main() {
    int n;  // 测试用例数量
    scanf("%d", &n); // 读取测试用例数
    
    // 处理每个测试用例
    while (n--) {
        // 结果数组:索引代表指数,值存储对应系数(初始化为0)
        int result[MAX_EXP + 1] = {0};
        int A, B; // 两个多项式的项数
        
        /* 处理第一个多项式 */
        scanf("%d", &A); // 读取第一个多项式的项数
        for (int i = 0; i < A; i++) {
            int exp, coeff;
            scanf("%d %d", &exp, &coeff); // 读取指数和系数
            result[exp] += coeff; // 累加到对应指数位置
        }
        
        /* 处理第二个多项式 */
        scanf("%d", &B); // 读取第二个多项式的项数
        for (int i = 0; i < B; i++) {
            int exp, coeff;
            scanf("%d %d", &exp, &coeff);
            result[exp] += coeff; // 累加到对应指数位置
        }
        
        /* 输出合并后的多项式 */
        int is_first = 1;  // 标记是否是首项(用于处理符号)
        for (int exp = 0; exp <= MAX_EXP; exp++) { // 从低到高遍历所有指数
            int coeff = result[exp];
            if (coeff == 0) continue; // 跳过系数为0的项
            
            char sign = '\0';       // 符号字符(默认为空)
            int abs_coeff;          // 系数的绝对值
            
            // 符号处理逻辑
            if (is_first) {         // 处理首项
                if (coeff < 0) {    // 负数需要显示负号
                    sign = '-';
                    abs_coeff = -coeff;
                } else {            // 正数不显示符号
                    abs_coeff = coeff;
                }
                is_first = 0;       // 后续项不再为首项
            } else {                // 处理非首项
                if (coeff < 0) {    // 负数显示负号
                    sign = '-';
                    abs_coeff = -coeff;
                } else {            // 正数显示加号
                    sign = '+';
                    abs_coeff = coeff;
                }
            }
            
            // 输出符号(非首项或负数首项才有符号)
            if (sign != '\0') {
                putchar(sign);
            }
            
            // 输出项内容
            if (exp == 0) { // 处理常数项
                printf("%dx^0", abs_coeff); // 指数0的特殊格式
            } else {
                if (abs_coeff == 1) { // 系数1省略显示
                    printf("x^%d", exp);
                } else {
                    printf("%dx^%d", abs_coeff, exp);
                }
            }
        }
        
        // 处理所有项系数均为0的特殊情况
        if (is_first) { // 若从未输出过项,说明结果全为0
            printf("0");
        }
        printf("\n"); // 换行分隔不同测试用例
    }
    
    return 0; // 程序正常退出
}

代码解释

  1. 输入处理:首先读取测试数据的组数 n。对于每组数据,分别读取两
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值