原题传送门
Description
给定一个最高次为 \(n\) ,且形如 \(a_nx^n\ +\ a_{n-1}x^{n-1}\ +\ \cdots +\ a_1x_1\ +\ a_0 (a_n\neq 0)\) 的多项式的各项系数(即 \(a_n,a_{n-1},\cdots ,a_0\)),请写出此多项式。
这里写的规则可以归纳成以下几条 :
- 若 \(a_n>0\) ,则省略 \(+\) 号,反之,输出 \(a_n\)。
- 多项式的每一项与每一项之间都应有 \(+\) 或 \(-\) 进行连接,此符号取决于该位置后面的项的系数的正负。
- 该项系数为 \(0\) 时,该项与其前面的符号一同省略。
- 对于一次项 \(a_1x^1\) ,当 \(a_1\neq 0\) 时,输出 \(a_1x\),并非 \(a_1x^1\)。
Solution
很显然的一道模拟题,不过有很多注意的点。
具体规则在 Description 中已经阐明,这里需特别强调
-
输入时按照 \(x\) 的次数由高到低递减输入。
-
输出格式即按照 \(a_nx^n\ +\ a_{n-1}x^{n-1}\ +\ \cdots +\ a_1x_1\ +\ a_0\) 的格式。
那我们可以把整个大问题分成 \(4\) 个子问题,以及由这 \(4\) 个子问题衍生而生的子问题 :
- 输出 \(a[n]\) 。
- 特判 \(a[n]=1\) 和 \(a[n]=-1\) 的情况。
- 其余数字直接按照格式输出。
- 输出 \(a[n-1]\) 至 \(a[2]\) (设 \(i\in [2,n-1]\))。
- 分 \(a[n]=0\) , \(a[n]=1\) , \(a[n]=-1\) 和 \(a[n]>0\) 讨论(依次)。
- 其余数字(即 \(a[n]<0\) 的情况)直接按照格式输出。
- 输出 \(a[1]\) 。
- 分 \(a[1]=1\) , \(a[n]=-1\) , \(a[1]>0\) , \(a[1]\neq 0\) 讨论(\(a[1]\neq 0\) 需放在最后)。
- 输出 \(a[0]\) 。
- 分 \(a[0]>0\) 和 \(a[0]<0\) 讨论。
Code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
inline void read(int &x){
int f=1;
char ch=getchar();
x=0;
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch&15);
ch=getchar();
}
x*=f;
}
int n;
int a[101];
int main(){
read(n);
for(int i=n;i>=0;i--) read(a[i]);
if(a[n]==1) printf("x^%d",n);
else if(a[n]==-1) printf("-x^%d",n);
else printf("%dx^%d",a[n],n);
for(int i=n-1;i>=2;i--){
if(a[i]==0) continue;
if(a[i]==1){
printf("+x^%d",i);
continue;
}
if(a[i]==-1){
printf("-x^%d",i);
continue;
}
if(a[i]>0){
printf("+%dx^%d",a[i],i);
continue;
}
printf("%dx^%d",a[i],i);
}
if(a[1]==1) printf("+x");
else if(a[1]==-1) printf("-x");
else if(a[1]>0) printf("+%dx",a[1]);
else if(a[1]!=0) printf("%dx",a[1]);
if(a[0]>0) printf("+%d",a[0]);
else if(a[0]<0) printf("%d",a[0]);
return 0;
}