1 条题解

  • 0
    @ 2025-6-16 16:00:22

    题解:Polynomial Showdown(P1555)

    一、题目分析

    本题要求将给定的多项式系数按规范格式输出,需遵循以下规则:

    1. 项序规则:按降幂排列(从8次到0次)
    2. 符号规则
      • 首项为正不显示符号,负则显示-
      • 非首项通过++-连接,空格分隔
    3. 系数简化
      • 系数为±1时:
        • 非常数项省略1(如x2x^2而非1x21x^2
        • 常数项保留1(如1-1

    二、代码解析(C++实现)

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    using namespace std;
    
    const int nmax = 10;
    int index[nmax];  // 存储多项式系数(0-8次)
    
    // 判断绝对值是否为1
    bool isAbsOne(int tar) { return abs(tar) == 1; }
    // 判断是否为0
    bool isZero(int tar) { return tar == 0; }
    
    // 输出非首项(带符号和空格)
    void Output(int now) {
        if (index[now] == 0) return;  // 零系数跳过
        
        // 输出符号和空格
        if (index[now] > 0) printf(" + ");
        else printf(" - ");
        
        // 处理不同次数的项
        if (now == 1) {  // 一次项
            if (index[now] == 1) printf("x");
            else printf("%dx", abs(index[now]));
        } else if (now == 0) {  // 常数项
            printf("%d", abs(index[now]));
        } else {  // 高次项
            if (index[now] == 1) printf("x^%d", now);
            else printf("%dx^%d", abs(index[now]), now);
        }
    }
    
    int main() {
        while (scanf("%d", &index[8]) != EOF) {  // 读取系数(从8次到0次)
            for (int i = 7; i >= 0; --i) scanf("%d", &index[i]);
            
            // 寻找最高次非零系数项
            int now = 8;
            while (index[now] == 0 && now >= 0) now--;
            
            // 全零系数处理
            if (now < 0) {
                printf("0\n");
                continue;
            }
            
            // 输出首项(无前导符号)
            if (isAbsOne(index[now])) {
                if (index[now] < 0) printf("-");  // 负号处理
                if (now == 1) printf("x");        // 一次项
                else if (now == 0) printf("1");   // 常数项
                else printf("x^%d", now);         // 高次项
            } else {
                if (index[now] < 0) printf("-");  // 负号处理
                if (now == 1) printf("%dx", abs(index[now]));  // 一次项
                else if (now == 0) printf("%d", abs(index[now]));  // 常数项
                else printf("%dx^%d", abs(index[now]), now);  // 高次项
            }
            
            // 输出剩余项(带符号和空格)
            for (int i = now - 1; i >= 0; --i) Output(i);
            printf("\n");
        }
        return 0;
    }
    

    三、关键步骤解析

    1. 输入处理

      • 按降幂顺序读取9个系数(8次到0次)
      • 使用数组indexindex存储各次项系数
    2. 最高次非零项定位

      • 从8次项开始向前查找首个非零系数项
      • 若全零,直接输出00
    3. 首项输出

      • 特殊处理系数±1:
        • 常数项保留1(1-1
        • 非常数项省略1(如x3-x^3
      • 一次项省略指数(如xx而非x1x^1
    4. 剩余项输出

      • 通过OutputOutput函数处理非首项:
        • 正系数输出+ + ,负系数输出 -
        • 按规则省略系数1(非常数项)
        • 正确处理不同次数的格式(如xxx2x^2

    四、示例验证

    以输入0001223330110 0 0 1 22 -333 0 1 -1为例:

    1. 系数数组(从低到高):
      [1,1,0,333,22,1,0,0,0][-1, 1, 0, -333, 22, 1, 0, 0, 0]
      对应次数:0,1,2,3,4,5,6,7,80, 1, 2, 3, 4, 5, 6, 7, 8

    2. 最高次非零项
      5次项(系数1),输出x5x^5

    五、易错点与优化

    1. 符号处理

      • 首项无前导符号,需单独判断
      • 非首项通过OutputOutput函数统一添加符号和空格
    2. 系数简化

      • 系数为±1时,仅非常数项省略1
      • 常数项需保留完整系数(如1-1
    3. 零系数处理

      • 遍历过程中跳过零系数项
      • 全零情况特殊处理为00
    4. 复杂度分析

      • 时间复杂度:O(1)(固定9个系数)
      • 空间复杂度:O(1)(数组大小固定)

    六、改进方向

    1. 代码结构优化

      • 合并相似逻辑(如首项和非首项的处理)
      • 使用模板或宏简化重复代码
    2. 输入处理优化

      • 使用scanfscanf一次性读取一行,再解析系数
      • 处理非法输入(如非数字字符)
    3. 扩展性

      • 支持任意次数的多项式(动态调整数组大小)
      • 添加系数范围检查(题目要求系数绝对值<1000)
    • 1

    信息

    ID
    556
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    2
    已通过
    1
    上传者