题解:洛谷 P1067 多项式输出

【题目来源】

洛谷:P1067 [NOIP 2009 普及组] 多项式输出 - 洛谷(luogu.com.cn)

【题目描述】

一元 \(n\) 次多项式可用如下的表达式表示:

其中,\(a_ix^i\) 称为 \(i\) 次项,\(a_i\) 称为 \(i\) 次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:

  1. 多项式中自变量为 \(x\),从左到右按照次数递减顺序给出多项式。
  2. 多项式中只包含系数不为 \(0\) 的项。
  3. 如果多项式 \(n\) 次项系数为正,则多项式开头不出 + 号,如果多项式 \(n\) 次项系数为负,则多项式以 - 号开头。
  4. 对于不是最高次的项,以 + 号或者 - 号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于 \(0\) 次的项,其系数的绝对值为 \(1\),则无需输出 \(1\))。如果 \(x\) 的指数大于 \(1\),则接下来紧跟的指数部分的形式为“\(x^b\)”,其中 \(b\)\(x\) 的指数;如果 \(x\) 的指数为 \(1\),则接下来紧跟的指数部分形式为 \(x\);如果 \(x\) 的指数为 \(0\),则仅需输出系数即可。
  5. 多项式中,多项式的开头、结尾不含多余的空格。

【输入】

输入共有 \(2\)

第一行 \(1\) 个整数,\(n\),表示一元多项式的次数。

第二行有 \(n+1\) 个整数,其中第 \(i\) 个整数表示第 \(n-i+1\) 次项的系数,每两个整数之间用空格隔开。

【输出】

输出共 \(1\) 行,按题目所述格式输出多项式。

【输入样例】

5
100 -1 1 -3 0 10

【输出样例】

100x^5-x^4+x^3-3x^2+10

【核心思想】

  1. 问题分析:给定一个 \(n\) 次多项式的系数(从最高次到常数项),要求按照特定格式输出多项式。格式规则包括:省略系数为 0 的项、处理首项符号、系数绝对值为 1 时省略系数、指数为 1 时省略指数、指数为 0 时只输出常数。本质是一个格式化字符串输出问题,需要根据多项式的次数和系数逐项处理。

  2. 算法选择

    • 逐项处理:从最高次项到常数项遍历,对每一项根据其系数和指数决定输出格式。维护一个标志变量记录是否已输出过非零项,用于决定是否添加符号。
    • 分类讨论:对系数 \(a_i\) 的符号、绝对值是否为 1、指数 \(i\) 的值进行分支处理。
  3. 关键步骤

    • 读入:读取 \(n\),然后读取 \(n+1\) 个系数(从 \(a_n\)\(a_0\))。
    • 初始化:设置 first = true 标记是否为第一项。
    • 遍历i\(n\)\(0\)
      • a[i] == 0,跳过。
      • 符号处理
        • first,则若 a[i] < 0 输出 -,否则不输出符号(正数首项无符号)。
        • 否则,若 a[i] > 0 输出 +,若 a[i] < 0 输出 -
      • 系数输出
        • abs(a[i]) != 1i == 0,输出 abs(a[i])
        • 否则(系数绝对值为 1 且指数 > 0),不输出系数。
      • 指数输出
        • i > 1,输出 x^ + i
        • i == 1,输出 x
        • i == 0,不输出。
      • 设置 first = false
    • 特判:若所有系数均为 0,输出 0
  4. 时间/空间复杂度

    • 时间复杂度:\(O(n)\)
    • 空间复杂度:\(O(n)\)
  5. 格式化输出与分支逻辑

    • 符号控制:首项正数不加符号,其余项根据系数符号添加 +-
    • 系数省略:当系数绝对值为 1 且指数不为 0 时,省略系数 1。
    • 指数格式x^1 省略为 xx^0 省略指数。
    • 适用场景:这类“多项式格式化输出”是模拟题的经典题型,考查字符串处理和条件分支。

【算法标签】

普及- #模拟

【代码详解】

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n, a[105];  // n 表示多项式的最高次幂,a 数组存储多项式的系数
    cin >> n;  // 输入多项式的最高次幂

    // 从高次幂到低次幂依次输入系数
    for (int i = n; i >= 0; i--)
        cin >> a[i];

    // 从高次幂到低次幂依次输出多项式
    for (int i = n; i >= 0; i--)
	{
        // 如果当前项的系数为0,跳过不输出
        if (a[i] == 0) continue;

        // 如果多项式是常数项(n=0),直接输出常数项并结束循环
        if (n == 0)
		{
            cout << a[i];
            break;
        }

        // 处理常数项(i=0)的情况
        if (i == 0)
		{
            if (a[i] > 0)
			{
                cout << "+" << a[i];  // 如果常数项为正,输出带加号的常数项
                break;
            }
			else if (a[i] < 0)
			{
                cout << a[i];  // 如果常数项为负,直接输出常数项
                break;
            }
        }

        // 处理非常数项的情况
        if (a[i] > 0)
		{
            if (i != n) cout << "+";  // 如果不是最高次项,输出加号
            if (a[i] != 1) cout << a[i];  // 如果系数不为1,输出系数
        }
        if (a[i] < 0)
		{
            if (a[i] == -1) cout << "-";  // 如果系数为-1,只输出负号
            else cout << a[i];  // 否则输出系数
        }

        // 输出指数项
        if (i > 1) printf("x^%d", i);  // 如果指数大于1,输出x的指数形式
        else if (i == 1) cout << "x";  // 如果指数为1,只输出x
    }

    return 0;
}

【运行结果】

3
-50 0 0 1
-50x^3+1
posted @ 2026-08-31 09:23  团爸讲算法  阅读(11)  评论(0)    收藏  举报