题目描述
一元nn次多项式可用如下的表达式表示:
f(x)=a_nx^n+a_{n-1}x^{n-1}+\cdots +a_1x+a_0,a_n\ne 0f(x)=anxn+an−1xn−1+⋯+a1x+a0,an=0
其中,a_ix^iaixi称为ii次项,a_iai 称为ii次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:
多项式中自变量为xx,从左到右按照次数递减顺序给出多项式。
多项式中只包含系数不为00的项。
如果多项式nn次项系数为正,则多项式开头不出现“+”号,如果多项式nn次项系数为负,则多项式以“-”号开头。
对于不是最高次的项,以“+”号或者“-”号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于00次的项,其系数的绝对值为11,则无需输出 11)。如果xx的指数大于11,则接下来紧跟的指数部分的形式为“x^bxb”,其中 bb为 xx的指数;如果 xx的指数为11,则接下来紧跟的指数部分形式为“xx”;如果 xx 的指数为00,则仅需输出系数即可。
多项式中,多项式的开头、结尾不含多余的空格。
输入格式
输入共有 22 行
第一行11 个整数,nn,表示一元多项式的次数。
第二行有 n+1n+1个整数,其中第ii个整数表示第n-i+1n−i+1 次项的系数,每两个整数之间用空格隔开。
输出格式
输出共 11 行,按题目所述格式输出多项式。
输入输出样例
5 100 -1 1 -3 0 10
100x^5-x^4+x^3-3x^2+10
3 -50 0 0 1
-50x^3+1
说明/提示
NOIP 2009 普及组 第一题
对于100%数据,0 \le n \le 1000≤n≤100,-100 \le−100≤系数\le 100≤100
解题过程:
题目并不难,只是要注意一些坑点:
1.当前几个系数都是0的时候注意第一个非零的系数前没有正号
2.当系数是1or-1的时候不需要输出数字,但是!!最后一个数字是1或者-1时是需要输出的
3.不是首位非0的系数要注意前面的系数问题
大致的坑点就这些,写完之后自己再测试一下几个样例,基本就能通过
代码如下:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=10005; 5 typedef long long ll; 6 7 int a,n; 8 int num[maxn]; 9 10 //这里将x的输出单独列开来方便下面的书写 11 void print(int n) 12 { 13 if(n==0) 14 return; 15 if(n>1) 16 cout<<"x^"<<n; 17 else 18 cout<<"x"; 19 return; 20 } 21 22 23 int main() 24 { 25 while(cin>>n) 26 { 27 int k=n; 28 bool flag=true; 29 for(int i=0;i<=n;++i) 30 { 31 cin>>a; 32 if(a==0) 33 { 34 k--; 35 continue; 36 } 37 if(flag) 38 { 39 if(a==1) 40 print(k); 41 else if(a==-1) 42 { 43 cout<<"-"; 44 print(k); 45 } 46 else 47 { 48 cout<<a; 49 print(k); 50 } 51 flag=false; 52 } 53 else 54 { 55 if(a==1) 56 { 57 cout<<"+"; 58 if(k!=0) 59 print(k); 60 else 61 cout<<1; 62 } 63 else if(a==-1) 64 { 65 cout<<"-"; 66 if(k!=0) 67 print(k); 68 else 69 cout<<1; 70 } 71 else if(a>0) 72 { 73 cout<<"+"<<a; 74 print(k); 75 } 76 else 77 { 78 cout<<a; 79 print(k); 80 } 81 } 82 k--; 83 } 84 cout<<endl; 85 } 86 return 0; 87 }