1. 程式人生 > 實用技巧 >洛谷題解P1067 多項式輸出

洛谷題解P1067 多項式輸出

原題傳送門

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;
}