首页 > 其他分享 >洛谷P1067 [NOIP2009 普及组] 多项式输出

洛谷P1067 [NOIP2009 普及组] 多项式输出

时间:2024-07-28 09:51:01浏览次数:10  
标签:输出 系数 洛谷 cout 指数 多项式 NOIP2009 我们 P1067

题目链接:- P1067 [NOIP2009 普及组] 多项式输出

题目叙述:

[NOIP2009 普及组] 多项式输出

题目描述

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

  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 行,按题目所述格式输出多项式。

样例 #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以外的数字,我们就不用输出'-',否则要输出'-')
  2. 系数(只要系数不为正负1,或者后面x的指数为0,我们就得输出这个系数,不过正负1还得特殊处理一下)
  3. x的指数(如果为1,我们就输出'x',否则输出"x^i",i为指数,x的指数为0 ,我们就直接输出系数,所以说这里的系数为-1的情况需要特殊处理一下)

步骤讲解:

我们观察到,这个x的指数是从n一直递减到0的,如果输入的系数为0时,就不做任何处理,所以我们可以边输入边处理,如果输入的系数为0,就直接进入下一轮循环

  1. 首先,我们要先处理系数输出的问题,什么时候要输出'+',什么时候要输出'-'?

输出'+'的时候:不为第一项,并且系数要大于0(小于0的时候系数自带负号,直接输出即可)

输出'-'的时候:x的指数不为0,并且系数为-1(因为其它的负数自带负号,直接输出其它负数的系数就可以输出那个负号了,-1是一个例外)

代码如下:

			//注意输出的顺序,我们应该是有符号就先输出符号,没有符号就考虑系数,有系数(系数不是正负1),就输出系数,最后输出x和x的指数
			//输出+号
			if (i != n && a > 0) cout << "+";
			//输出-号,需要系数为-1,并且指数不为0
			if (a == -1 && i != 0) cout << "-";
  1. 输出系数,我们要明确我们什么时候会输出系数?要系数的值不为正负1,或者是指数为0的情况,我们就需要将正负1的那个系数放出来了,对吧?代码如下:
			//输出系数,需要系数不为正负1,或者后面的指数为0,系数为-1,x的指数为0的情况在这里。
			if (abs(a) > 1 || i == 0) cout << a;
  1. 输出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. 输入第一项,我们会进入处理系数的步骤,没问题
  2. 输入负的系数,并且不为正负1,我们会进入直接输出系数的步骤,没问题
  3. 输入系数为-1,但是指数为0,我们仍然会输出这个系数,没问题。
  4. 输入系数为1,但是指数也为0,我们也会输出这个系数,也没问题。

我们还可以列举多几种情况,检查一下,其实我们这个逻辑是没有问题的。

总结与反思

做题不要一上来就把所有的情况列举出来,有时候所有情况列举出来只会复杂度很,我们需要从大局上面观察

标签:输出,系数,洛谷,cout,指数,多项式,NOIP2009,我们,P1067
From: https://www.cnblogs.com/Tomorrowland/p/18327826

相关文章

  • 洛谷P1042 [NOIP2003 普及组] 乒乓球
    题目链接:-P1042[NOIP2003普及组]乒乓球[NOIP2003普及组]乒乓球题目背景国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役......
  • 洛谷题单指南-前缀和差分与离散化-P3397 地毯
    原题链接:https://www.luogu.com.cn/problem/P3397题意解读:给定一个n*n的矩阵,每个元素初始值为0,再将m个子矩阵中的元素都增加1,统计每个元素最终的值。解题思路:1、暴力法枚举每一个子矩阵,将对应元素值加1,时间复杂度为1000^3,不可行。2、二维差分对于给定二维数组s[][],给指定区......
  • 洛谷题单指南-前缀和差分与离散化-P2367 语文成绩
    原题链接:https://www.luogu.com.cn/problem/P2367题意解读:对于数组s[],给指定q个区间[x,y]里每个数增加z,计算操作之后最小的数。解题思路:1、暴力做法对于每一个区间[x,y],枚举给每一个数增加z,然后遍历查找最小值,总体时间复杂度为O(N^2),不可行。2、一维差分对于给指定区间[x,......
  • 洛谷 模板 单源最短路径(标准版)
    原题p4779题目背景2018年7月19日,某位同学在 NOIDay1T1归程 一题里非常熟练地使用了一个广为人知的算法求最短路。然后呢?100→60;Ag→Cu;最终,他因此没能与理想的大学达成契约。小F衷心祝愿大家不再重蹈覆辙。题目描述给定一个 n 个点,m 条有向边的带非负......
  • 洛谷 跳石头
    原题题目描述一年一度的“跳石头”比赛又要开始了!这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 N 块岩石(不含起点和终点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直......
  • 洛谷题单指南-前缀和差分与离散化-P1314 [NOIP2011 提高组] 聪明的质监员
    原题链接:https://www.luogu.com.cn/problem/P1314题意解读:计算m个检验值之和,计算与s差值绝对值的最小值。解题思路:1、首先要搞懂检验值是如何计算的如上图,对于每一个区间的检验值yi,表示为:yi="该区间重量>=W的矿石个数" ✖️"该区间>=W的矿石价值之和"检验值y即所有yi(1<=......
  • 洛谷 P1161 开灯
    目录题目-开灯题目描述输入格式输出格式样例#1样例输入#1样例输出#1提示ACCODE思路ACCODEC++说明使用Map做数据标记,会出现TEL向下取整<math.h>中常用的函数题目-开灯题目描述在一条无限长的路上,有一排无限长的路灯,编号为1,2,3,4,······。每一盏灯......
  • 洛谷刷题题单
    【算法1-1】模拟与高精度 [NOIP2003普及组]乒乓球 [NOIP2003普及组]乒乓球......
  • 洛谷题单指南-前缀和差分与离散化-P8218 【深进1.例1】求区间和
    原题链接:https://www.luogu.com.cn/problem/P8218题意解读:对于数组a[N],给定m个区间l~r,求每个区间所有元素之和。解题思路:先思考暴力做法:对于每一个区间[l,r],累加a[l]~a[r]所有元素,时间复杂度最坏为10^5*10^4,不可行。一维前缀和:设s[N]是a[N]的前缀和数组,即对于每一个s[i......
  • 线段树(区间操作,例题:洛谷P3372 线段树 1)
    在上一节线段树(原理、构造和区间查询,例题:BalancedLineup)中介绍了线段树的构造,下面就来说一下它的区间操作。区间操作与Lazy-Tag有关,如果修改操作是对区间内的每个元素一一修改,就会比较繁琐低效,目前的解决办法是线段树的tree[i].data记录的是区间i的值(详细见上节),可以再定义一......