P1067 [NOIP2009 普及组] 多项式输出
考点:字符串、模拟
;
测评链接:P1067 [NOIP2009 普及组] 多项式输出
讲解视频:稍后上传;
题意&分析
题意
给一元 n 次多项式用下列的格式进行表示:
f
(
x
)
=
a
n
x
n
+
a
n
−
1
x
n
−
1
+
.
.
.
+
a
1
x
+
a
0
,
a
n
≠
0
f(x) = a_nx^n + a_{n-1}x^{n-1} + ... + a_1x+a_0, a_n \ne 0
f(x)=anxn+an−1xn−1+...+a1x+a0,an=0
- 多项式中自变量为 x x x,从左到右按照次数 递减顺序 给出多项式。
- 多项式中只包含 系数不为 0 的项。
- 如果多项式
n
n
n 次项系数为正,则多项式开头不出
+
号,如果多项式 n n n 次项系数为负,则多项式以-
号开头。 - 对于不是最高次的项,以
+
号或者-
号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于 0 0 0 次的项,其系数的绝对值为 1 1 1,则无需输出 1 1 1)。如果 x x x 的指数大于 1 1 1,则接下来紧跟的指数部分的形式为“ x b x^b xb”,其中 b b b 为 x x x 的指数;如果 x x x 的指数为 1 1 1,则接下来紧跟的指数部分形式为 x x x;如果 x x x 的指数为 0 0 0,则仅需输出系数即可。 - 多项式中,多项式的开头、结尾不含多余的空格。
分析
从前往后一次处理每一项,依次考虑符号、系数、 x x x、 x x x 的系数:
- 如果系数是
0
0
0,则直接
continue
。 - 如果不是第一个非零项,且系数是整的,则输出
‘+’
;如果系数是负的,则无条件输出‘-’
; - 如果系数的绝对值不是 1 1 1,或者常数项,则输出系数的绝对值。
- 如果次数不为 0 0 0,则输出 x x x。
- 如果次数大于 1 1 1,则输出次数。
代码
#include<bits/stdc++.h>
using namespace std;
int n;
bool first = true; // 是否为第一项标记
int main() {
cin >> n;
for (int i = n, x; i >= 0; i--) {
cin >> x;
if ( x == 0 ) continue; // 判 0
if ( !first && x > 0)
cout << '+';
else if ( x < 0 )
cout << '-'; // 判负
if ( abs(x) != 1 || !i ) // 系数不是1 / 最后一项,则
cout << abs(x);
if ( i ) cout << 'x';
if ( i > 1 ) cout << "^" << i;
first = false;
}
return 0;
}