洛谷題解P1067 多項式輸出
阿新 • • 發佈:2020-11-20
原題傳送門
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;
}