題目 小明的階乘和
有些數可以表示成若干個不同階乘的和。例如,9=1!+2!+3!。小明對這些數很感興趣,所以他給你一個正整數n,想讓你告訴他這個數是否可以表示成若干個不同階乘的和。
輸入
輸入包含多組測試資料。每組輸入為一個非負整數n(n<=1000000),當n為負數時,輸入結束。
輸出
對於每組輸入,如果n可以表示成若干個不同階乘的和,則輸出YES,否則輸出NO。
樣例輸入
9
-1
樣例輸出
YES
理解:這裡因為其輸入的資料是有範圍限制,而且又是涉及到階乘問題(記得考慮一些0的階乘是否在題目要求範圍內),所以可以像處理有限已知字串的方法一樣,將有限的階乘的值給存到一個固定的陣列中,然後再對這個固定陣列進行操作。對於有限已知的東西都可以這樣直接存到陣列中。這個題目是要進行反向減的形式進行的,(所以在有些題目中,尤其是這種需要判斷正向順序還是逆向順序,再換句話說就是逆向思維考慮還是正向思維考慮)。
程式碼:
include
int main()
{
int n,a[10];
a[0]=1;
int i,j;
for(j=1;j<10;++j)
a[j]=a[j-1]*j;/*存的時候陣列中的數有相互關係時,記得利用相互關係,進而減少次數*/
while(scanf("%d",&n)!=EOF)
{
if(n<0)
break;
if(n==0)
{
printf("NO
");
break;
}
for(i=9;i>=0;--i)
{
if(n>=a[i])
n-=a[i];
if(n==0)
break;
}
printf(n==0?"YES
":"NO
");/*運用三. 目條件運算子來替換if else語句,從而減少程式碼長度*/
}
return 0;
}