【09NOIP普及组】多项式输出

【题目描述】
一元 nn 次多项式可用如下的表达式表示:

f(x)=anxn+an−1xn−1+…+a1x+a0,an≠=0
f(x)=anxn+an−1xn−1+…+a1x+a0,an≠=0
其中,aixiaixi 称为ii次项,aiai称为ii次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:

  1. 多项式中自变量为xx,从左到右按照次数递减顺序给出多项式。

  2. 多项式中只包含系数不为00 的项。

  3. 如果多项式nn 次项系数为正,则多项式开头不出现“++”号,如果多项式nn 次项系数为负,则多项式以“−−”号开头。

  4. 对于不是最高次的项,以“++”号或者“−−”号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于00 次的项,其系数的绝对值为11,则无需输出11)。如果xx 的指数大于11,则接下来紧跟的指数部分的形式为“x∧bx∧b”,其中bb 为xx 的指数;如果xx 的指数为11,则接下来紧跟的指数部分形式为“xx”;

如果xx 的指数为00,则仅需输出系数即可。

  1. 多项式中,多项式的开头、结尾不含多余的空格。

【输入】
共有2 行

第一行 11 个整数,nn,表示一元多项式的次数。

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

【输出】
共1 行,按题目所述格式输出多项式。

【输入样例】
5
100 -1 1 -3 0 10
【输出样例】
100x5-x4+x3-3x2+10
【提示】
【输入输出样例2】

输入:

3
-50 0 0 1
输出:

-50x^3+1
【数据范围】

1≤n≤1001≤n≤100,多项式各次项系数的绝对值均不超过100100。

#include<bits/stdc++.h>
using namespace std;
int flag;
int main(){
	int n, x;
	cin >> n;
	for(int i=n; i>=0; i--){
		cin >> x;
		if(i == 0){
			if(x < 0)
				cout << "-";
			if(x > 0 && flag == 1)
				cout << "+";
			if(x != 0)
				cout << abs(x);
		}else{
			if(x != 0){
				if(x < 0){
					flag = 1;
					cout << "-";
					if(x != -1)
						cout << abs(x);
				}else{
					if(flag == 1)
						cout << "+";
					flag = 1;
					if(x != 1)
						cout << x;
				}
				cout << "x";
				if(i != 1)
					cout << "^" << i;
			}
		}
	}
	return 0;
}

这个题不难,但是有两个细节需要注意,
第一个:系数为正负1的情况,容易忽略的是:第一项系数是否需要符号,如果是正数,是不需要使用的+符号的;而如果是负数,是需要-符号的;还要排除系数为0的情况;
第二个:指数稍微好一点,没有负号,但也要特殊处理1和0的情况。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值