對於數字或者字串有限的問題的處理

haixinjiazu發表於2019-05-12

題目 小明的階乘和
有些數可以表示成若干個不同階乘的和。例如,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;

}

相關文章