洛谷P1067 [NOIP2009 普及组] 多项式输出
题目链接:- P1067 [NOIP2009 普及组] 多项式输出
题目叙述:
[NOIP2009 普及组] 多项式输出
题目描述
一元 n 次多项式可用如下的表达式表示:
-
多项式中自变量为 x,从左到右按照次数递减顺序给出多项式。
-
多项式中只包含系数不为 0 的项。
-
如果多项式 n 次项系数为正,则多项式开头不出
+
号,如果多项式 n 次项系数为负,则多项式以-
号开头。 -
对于不是最高次的项,以
+
号或者-
号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于 0 次的项,其系数的绝对值为 1,则无需输出 1)。如果 x 的指数大于 1,则接下来紧跟的指数部分的形式为“x^b”,其中 b 为 x 的指数;如果 x 的指数为 1,则接下来紧跟的指数部分形式为 x;如果 x 的指数为 0,则仅需输出系数即可。 -
多项式中,多项式的开头、结尾不含多余的空格。
输入格式
输入共有 2 行
第一行 1 个整数,n,表示一元多项式的次数。
第二行有 n+1 个整数,其中第 i 个整数表示第 n-i+1 次项的系数,每两个整数之间用空格隔开。
输出格式
输出共 1 行,按题目所述格式输出多项式。
样例 #1
样例输入 #1
5
100 -1 1 -3 0 10
样例输出 #1
100x^5-x^4+x^3-3x^2+10
样例 #2
样例输入 #2
3
-50 0 0 1
样例输出 #2
-50x^3+1
提示
NOIP 2009 普及组 第一题
对于100%数据, 0<=n<=100, -100<= 系数<=100;
思路:
这题乍一看要分很多种情况,是不是第一位数字?,有没有符号?要不要输出指数上的那个数字?如果我们从这些角度出发的话,这道题就复杂无比,要细分很多种情况,我们不妨从结果的输出观察
结果的输出包括:
- 符号(如果系数不是负数的话,就得输出'+'(除掉第一项外),如果系数是负数的话,就看需不需要单独输出"-",系数是除-1以外的数字,我们就不用输出'-',否则要输出'-')
- 系数(只要系数不为正负1,或者后面x的指数为0,我们就得输出这个系数,不过正负1还得特殊处理一下)
- x的指数(如果为1,我们就输出'x',否则输出"x^i",i为指数,x的指数为0 ,我们就直接输出系数,所以说这里的系数为-1的情况需要特殊处理一下)
步骤讲解:
我们观察到,这个x的指数是从n一直递减到0的,如果输入的系数为0时,就不做任何处理,所以我们可以边输入边处理,如果输入的系数为0,就直接进入下一轮循环
- 首先,我们要先处理系数输出的问题,什么时候要输出'+',什么时候要输出'-'?
输出'+'的时候:不为第一项,并且系数要大于0(小于0的时候系数自带负号,直接输出即可)
输出'-'的时候:x的指数不为0,并且系数为-1(因为其它的负数自带负号,直接输出其它负数的系数就可以输出那个负号了,-1是一个例外)
代码如下:
//注意输出的顺序,我们应该是有符号就先输出符号,没有符号就考虑系数,有系数(系数不是正负1),就输出系数,最后输出x和x的指数
//输出+号
if (i != n && a > 0) cout << "+";
//输出-号,需要系数为-1,并且指数不为0
if (a == -1 && i != 0) cout << "-";
- 输出系数,我们要明确我们什么时候会输出系数?要系数的值不为正负1,或者是指数为0的情况,我们就需要将正负1的那个系数放出来了,对吧?代码如下:
//输出系数,需要系数不为正负1,或者后面的指数为0,系数为-1,x的指数为0的情况在这里。
if (abs(a) > 1 || i == 0) cout << a;
- 输出x和它的指数,这一步是最简单的,我们只需要知道指数是不是为1即可(指数为0的情况在前面已经处理了)代码如下:
//输出x,只有指数为1,这一种情况
if (i == 1) cout << "x";
//输出x^i这种形式,需要指数>1
if (i > 1) cout << "x^" << i;
完整的代码如下:
#include<iostream>
using namespace std;
int main()
{
int n; cin >> n;
for (int i = n; i >= 0; i--) {
int a; cin >> a;
//如果当前数字为0,就直接跳过
if (a != 0) {
//注意输出的顺序,我们应该是有符号就先输出符号,没有符号就考虑系数,有系数(系数不是正负1),就输出系数,最后输出x和x的指数
//输出+号
if (i != n && a > 0) cout << "+";
//输出-号,需要系数为-1,并且指数不为0
if (a == -1 && i != 0) cout << "-";
//输出系数,需要系数不为正负1,或者后面的指数为0,系数为-1,x的指数为0的情况在这里。
if (abs(a) > 1 || i == 0) cout << a;
//输出x,只有指数为1,这一种情况
if (i == 1) cout << "x";
//输出x^i这种形式,需要指数>1
if (i > 1) cout << "x^" << i;
}
}
return 0;
}
自己跑一遍流程
很多时候我们都不知道我们写的代码是否有bug,而且如果是竞赛中写题,部分竞赛会有罚时,这时候我们就需要自己模拟着去跑一遍流程了
首先,输入系数,如果系数为0,直接跳过,进入下一层循环,否则,就进入处理的逻辑
如果这是第一项的话,就进入处理系数的环节,执行if (abs(a) > 1 || i == 0) cout << a;
这条语句
否则,进入第一条语句:if (i != n && a > 0) cout << "+";
,输出+号,然后再进入上面那条语句,然后再处理系数
然后就是处理x和它的指数了,似乎没问题,我们把特殊的几种情况罗列一下,看看能不能正确处理,如果能,那就是对的
- 输入第一项,我们会进入处理系数的步骤,没问题
- 输入负的系数,并且不为正负1,我们会进入直接输出系数的步骤,没问题
- 输入系数为-1,但是指数为0,我们仍然会输出这个系数,没问题。
- 输入系数为1,但是指数也为0,我们也会输出这个系数,也没问题。
我们还可以列举多几种情况,检查一下,其实我们这个逻辑是没有问题的。
总结与反思
做题不要一上来就把所有的情况列举出来,有时候所有情况列举出来只会复杂度很,我们需要从大局上面观察
热门相关:剑仙三千万 史上第一密探 弃妇种田忙 神医娘亲:腹黑萌宝赖上门 盖世双谐