1. 程式人生 > >NYOJ 貪心演算法 91 階乘之和

NYOJ 貪心演算法 91 階乘之和

階乘之和

時間限制:3000 ms  |  記憶體限制:65535 KB

難度:3

描述

給你一個非負數整數n,判斷n是不是一些數(這些數不允許重複使用,且為正數)的階乘之和,如9=1!+2!+3!,如果是,則輸出Yes,否則輸出No;

輸入

第一行有一個整數0<m<100,表示有m組測試資料;
每組測試資料有一個正整數n<1000000;

輸出

如果符合條件,輸出Yes,否則輸出No;

樣例輸入

2
9
10

樣例輸出

Yes
No

在寫這道題的時候一開始理解錯了題意以為必須是從1的階乘開始(審題真的很重要!重要!重要!)。後來才明白只需一些數的階乘和就好。看到了很多方法我還是覺的下面的這種方法比較簡單點。簡單粗暴的先列出到1~9的階乘是多少。最後倒著減就好直到n=0的時候結束。下面看一下程式碼。

 
#include <cstdio>
using namespace std;
int s[9] = {1,2,6,24,120,720,5040,40320,362880};
 
int main()
{
    int t, n;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &n);
        for(int i=8; i>=0; i--)
        {
            if(n>=s[i])
            {
                n -= s[i];
                if(n == 0) {printf("Yes\n");break;}
            }
        }
        if(n != 0) printf("No\n");
    }
    return 0;
}