题目描述
一元 𝑛n 次多项式可用如下的表达式表示:
𝑓(𝑥)=𝑎𝑛𝑥𝑛+𝑎𝑛−1𝑥𝑛−1+⋯+𝑎1𝑥+𝑎0,𝑎𝑛≠0f(x)=anxn+an−1xn−1+⋯+a1x+a0,an=0
其中,𝑎𝑖𝑥𝑖aixi 称为 𝑖i 次项,𝑎𝑖ai 称为 𝑖i 次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:
-
多项式中自变量为 𝑥,从左到右按照次数递减顺序给出多项式。
-
多项式中只包含系数不为 00 的项。
-
如果多项式 𝑛 次项系数为正,则多项式开头不出
+
号,如果多项式 𝑛n 次项系数为负,则多项式以-
号开头。 -
对于不是最高次的项,以
+
号或者-
号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于 0 次的项,其系数的绝对值为 1,则无需输出 1)。如果 𝑥 的指数大于 1,则接下来紧跟的指数部分的形式为“𝑥b”,其中 𝑏 为 𝑥 的指数;如果 𝑥 的指数为 1,则接下来紧跟的指数部分形式为 𝑥;如果 𝑥 的指数为 0,则仅需输出系数即可。 -
多项式中,多项式的开头、结尾不含多余的空格。
输入格式
输入共有 2 行
第一行 1 个整数,𝑛,表示一元多项式的次数。
第二行有 𝑛+1 个整数,其中第 𝑖i 个整数表示第 𝑛−𝑖+1n−i+1 次项的系数,每两个整数之间用空格隔开。
输出格式
输出共 1 行,按题目所述格式输出多项式。
输入输出样例
官方样例1
输入 5 100 -1 1 -3 0 10
输出 100x^5-x^4+x^3-3x^2+10
官方样例2
输入3 -50 0 0 1 输出 -50x^3+1
ALL AC(不干净)
#include<bits/stdc++.h>
using namespace std;
int n,po,temp;bool if_jiahao=false;
int main()
{
cin>>n;po=n;
for(int i=1;i<=n;i++)
{
cin>>temp;
if(temp==0)
{
po--;
continue;//是0啥都不用说了 0乘任何数都得0 0*0也一样
}
if(temp<=-1)
{
if_jiahao=true;
if(temp==-1)//负数除了-1特殊点就没其他惹
{
//-1*-1=1 -1*-1*-1=-1 得-1的奇数次方为-1 反之为1
if(po%2==0)if(po!=0&&po!=1)cout<<"-x^"<<po;
else cout<<"-x";
else if(po!=0&&po!=1)cout<<"-x^"<<po;
else cout<<"-x";
}
else if(po!=0&&po!=1)cout<<temp<<"x^"<<po;
else cout<<temp<<"x";
}
else //正数
{
//if(i!=1)cout<<"+";//式子开头的加号可以省掉
if(if_jiahao)cout<<"+";
if_jiahao=true;
//中雷啦 万一它temp是0 0 10呢还要打+吗
if(temp==1)if(po!=0&&po!=1)cout<<"x^"<<po;//1可以省 1的任何次方都是1 1x^?要写为x^? 乘法分配
else cout<<"x";
else if(po!=0&&po!=1)cout<<temp<<"x^"<<po;
else cout<<temp<<"x";
}
po--;//次方数--
}
cin>>temp;
if(temp>0)if(n!=0)cout<<"+"<<temp;
else cout<<temp;
if(temp<0)cout<<temp;
return 0;
}
思路:其实很简单 让你输出(设这个数是temp)temp未知数(x)^次方(po)但没有这么简单 需要化简
分情况讨论
part A temp=0
0乘任何数都得0 直接continue跳过(记得次方数-1)
part B temp=负数
-1是个奇妙的数
-1的奇数次方还是-1 输出-1x^po(正确输出:-x^po) -1x一样可以省成-x
-1的偶数次方才是1 输出1x^po(正确输出:x^po) 1*任何数 1可以省掉
其他的都没有这种情况
请注意,
如果 𝑥 的指数为 1,则接下来紧跟的指数部分形式为 𝑥;如果 𝑥 的指数为 0,
则仅需输出系数即可。
所以代码倒数第3行到倒数第6行可以省掉(需将第7行i<+n改为i<=n+1)
part C temp=正数
众所周知 +1+1=2 可以写成 1+1=2 第一个数的加号省掉 也是我们化简要考虑的
(你以为的解决方法:只要这个数不是在第一个就行了)
(实际上:如果数据有3 0 0 10 20 阁下该如何面对?)
(解决方法:判断,如果这个数不是0(就是正数or负数)这个前导加号就可以不要惹)
(我的解决方法,新开变量if_jiahao)
1这个数很奇妙 1乘一个数=那个数 1x=x 1要省掉
其他的照着写
收工下播
1277 Problem A 2003.1乒乓球 42NOIP(普及1) PASS 2024.6.4
1278 Problem B 2006.1明明的随机数 42NOIP(普及1) PASS before2024.6.4
1281 Problem C 2009.1多项式输出 42NOIP(普及1) PASS 2024.6.4
1698 Problem D 2014.1珠心算测验 42NOIP(普及1)
1711 Problem E 2018.1标题统计 42NOIP(普及1)
1968 Problem F 2019.1数字游戏(非官方数据) 42NOIP(普及1)
1273 Problem A 2004.1不高兴的津津 42NOIP(普及1)
1275 Problem B 2001.1数的计数 42NOIP(普及1)
1276 Problem C 2002.1级数求和 42NOIP(普及1)
1280 Problem D 2008.1 ISBN号码 42NOIP(普及1)
1690 Problem E 2016.1买铅笔 42NOIP(普及1)
1702 Problem F 2013.1计数问题 42NOIP(普及1)
1283 Problem G 2010.1数字统计 42NOIP(普及1)
1284 Problem H 2017.1成绩 42NOIP(普及1)
1285 Problem I 2015.1金币 42NOIP(普及1)