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

news/2025/2/23 1:51:49/文章来源:https://www.cnblogs.com/Tomorrowland/p/18327826

题目链接:- 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,并且指数不为0if (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这种形式,需要指数>1if (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,并且指数不为0if (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这种形式,需要指数>1if (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,我们也会输出这个系数,也没问题。

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

总结与反思

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/772914.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[VSCode] SSH远程连接服务器总是提示SSH timed out

问题描述 在装有双系统的笔记本上, 在Windows端使用VSCode进行远程连接, 总是出现"SSH timed out"的问题, 而在Windows系统终端使用SSH连接则能连接成功. Linux端则不出现此问题. 问题解决 经排查排除了网络问题和VSCode配置文件的问题; 于是怀疑是Remote - SSH插件的…

BUUCTF 4.ciscn_2019_n_1

拿到题目首先先运行程序我们发现给了我们一个数字,我们猜测应该是一个条件判断的程序,然后我们检查一下保护机制我们发现只开了NX(不可执行)保护,那我们直接看IDA就行了。main函数只是设定了无缓冲模式,以及调用了一个func函数,然后我们看一下我们可以看到gets 和我们想…

python2

第三方IDE(集成开发工具) pycharm安装教程

快排CMS1.2文件上传漏洞

逻辑问题侵权声明 本文章中的所有内容(包括但不限于文字、图像和其他媒体)仅供教育和参考目的。如果在本文章中使用了任何受版权保护的材料,我们满怀敬意地承认该内容的版权归原作者所有。 如果您是版权持有人,并且认为您的作品被侵犯,请通过以下方式与我们联系: [360619…

裂行 换前减震弹簧

换完感受 优点 不在触底了,过坑洼路边更有信心。 缺点: 过弯极限变低,之前可以压很低,现在要重新适应一下,特别是右转,角度比较大的情况下 施工过程 厂家送了减震油,师傅给减震也拆开保养过, 外加换弹幕 ,自己恐怕是搞不定,没关系可以请师傅搞,当然要花点前。20分钟…

外贸邮箱注册:谷歌企业邮箱注册详细教程

做外贸行业,企业邮箱一定是与客户沟通的必要工具,我使用过的企业邮箱有很多,但使用下来体验最好用的还是谷歌企业邮箱。本篇教程就讲下如何注册一个谷歌企业邮箱。 在讲解前先普及一些关于企业邮箱的基础知识吧。 什么是企业邮箱 1.我们平常使用的 XX @qq.com 、 XX @outloo…

【待做】【攻防技术系列+网络协议】SSH攻防一体命令备忘清单

一、关于SSH SSH(缩写为“Secure Shell”或“Secure Socket Shell”)是一种网络协议,用于通过不安全的网络安全地访问网络服务。它包括实现SSH的一套实用工具,例如: ssh-keygen:用于为 SSH 创建新的身份验证密钥对;SCP(安全复制协议):用于在网络上的主机之间复制文件;…

gitlab 通过命令将ssh连接改为http连接

查看当前项目的连接命令git remote -v 更改当前项目的连接方式git remote set-url origin http://****

为什么老板现在要学习财务

一、新常态经济。什么是“新常态”?现在企业赚钱越来越难,利润 越来越薄,需要通过财务手段来精细化核算和精细化管理, 民营企业已进入抠细节、抠成本、抠利润的时代,而财务是 支撑企业精细化管理的核心工具。 二、大数据时代。经营决策需要数据,数据则主要来自 财务部…

如何让SQL Server像MySQL一样拥有慢查询日志(Slow Query Log慢日志)

如何让SQL Server像MySQL一样拥有慢查询日志(Slow Query Log慢日志) SQL Server一直以来被人诟病的一个问题是缺少了像MySQL的慢日志功能,程序员和运维无法知道数据库过去历史的慢查询语句。 因为SQLServer默认是不捕获过去历史的长时间阻塞的SQL语句,导致大家都认为SQL Se…

模拟退火学习笔记

骂谁罕见模拟退火学习笔记 前言 不知道为啥突然有闲情学这个... 模拟退火 (Simulated Annealing) , 简称 \(SA\) . 是一种基于随机化的算法,无门槛,主要是为了骗分... 不是正解!!!! 根据 爬山算法 的过程,我们发现:对于一个当前最优解附近的非最优解,爬山算法直接舍去…

录取查询

这道题赛时是想出来了,但是线段树出锅了,只得了20分。 首先根据题目我们可以得出,一个序列要是为T的子串,就必须满足以下三个条件。 1.该序列单调不降。如 ba肯定是不合法的。 2.该序列除去开头和结尾的字母,其他字母的数量必须为整个序列全部的该字母数量。 如 abbcba 选…