NYOJ 貪心演算法 91 階乘之和
阿新 • • 發佈:2018-11-20
階乘之和
時間限制: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; }