time limit: 1 second
memory limit: 128 mb
某些數能表示成為一些互不相同的整數的階乘之和。如9=l!+2! +3!。 現在給定乙個非負整數n,要求判斷n能否表示成為一些互不相 同的非負整數的階乘之和,如果能,則輸出「yes",否則輸出「n0」(引號不輸出)。
輸入檔案中每行乙個非負整數n(n≤1000000),最後一行是乙個負數,作為輸入的結束。
對輸入檔案中的每個非負整數n,在輸出檔案中分別輸出「yes」或「n0」,各佔l行。(引號不輸出)
9【題解】5-1
對於n >=3;n!> (n-1)!+(n-2)!+(n-3)!....
eg:0!=1 1!=1 2!=2 3!= 6
3 !>0!+1!+2!
根據這個原理,我們可以從9遞減到1進行列舉。(10!>100w),只要這個數字能夠減去i!,則一定要減。否則後面的數加起來都不能和i!一樣大。因此 規則就是遇到能減就減。
如果減完一次i!之後還能再減同樣的i!,那麼就無解了(要求數字要不同);最後判斷一下答案是否為0就好。
n<=2的情況是
2 1 1,如果2可以減,那麼就減。剩下兩個1,可以乙個乙個減。又都是整數。所以如果有解,是一定不會漏掉的。
【**】
#include #include #define maxn 19
int n,a[11];
void input_data()
if (temp >= a[i]) //如果能減就減。不能減的就跳過。
temp-=a[i];
}if (flag && temp == 0 && x!=0) //如果剛好減完就輸出有解資訊。
printf("yes\n");
else
printf("no\n");
scanf("%d",&x);
}}int main()
正整數分解
程式整體思路 分解就是乙個數減1,這個數後面的數加1 一次分解之後 找到最後乙個比1大的元素座標,然後與上一次相比,如果座標發生了偏移,那麼會發生向後偏移,說明又開始有乙個數需要分解,這個時候需要增加乙個元素,該情況下其實就是新出現了2 此時這個座標是2所在的位置 將2分解完畢之後,再繼續找比1大的...
整數分解與重組
對給定的整數進行分解與重組,集成為滿足某些特定條件的陣列,是一項具有挑戰性的設計,也是一類非常有趣的智力遊戲 本節探索 雙和3元2組 與 和積3元3組 兩個案例,注意分解的實施與重組條件 雙和 和積 的實現 把給定偶數2n分解為6個互不相等的正整數a b c d e f,然後把這6個數分成 a b ...
正整數分解演算法
問題 將以正整數n表示成一系列正整數之和.n n1 n2 n3 nk n1 n2 n3 nk 1,k 1 這就是正整數n的乙個劃分,正整數n不同的劃分個數稱為正整數n的劃分數,記作p n 例如 6 有如下11種劃分則p 6 116 5 1 4 2,4 1 1 3 3,3 2 1,3 1 1 1 2 ...