24h購物| | PChome| 登入
2011-06-10 20:55:31| 人氣3,804| 回應0 | 上一篇 | 下一篇

a144. 整數分拆

推薦 0 收藏 0 轉貼0 訂閱站台

http://zerojudge.tw/ShowProblem?problemid=a144

內容 :

一個正整數可以寫成一些正整數的。在數論上,跟這些和式有關的問題稱為整數分拆整數剖分整數分割。其中最常見的問題就是給定正整數n,求不同數組(a1,a2,...,ak)的數目,符合下面的條件:

  1. a1 + a2 + ... + ak = nk的大小不定)
  2. a_1 ge a_2 ... ge a_k
  3. 其他附加條件(例如限定「k是偶數」,或「ai不是1就是2」等)

分割函數p(n)是求符合以上第一、二個條件的數組數目。

 

輸入說明 :

輸入一個正整數n   , n < 100

EOF結束輸入

輸出說明 :

輸出符合分割函數p(n)的全部數組

以字典順序由大到小輸出

範例輸入 :

4

範例輸出 :

4
3 1
2 2
2 1 1
1 1 1 1

提示 :

出處 :

Netsphere | Wiki (管理:netsphere)


作法 : 遞迴模擬


/**********************************************************************************/
/*  Problem: a144 "整數分拆" from Netsphere | Wiki                            */
/*  Language: C                                                                   */
/*  Result: AC (4ms, 272KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-06-07 17:14:06                                     */
/**********************************************************************************/


#include<stdio.h>
#define Max 101
int ans[100] = {Max}, n;
void div(int n, int index) {
    int a, next = index+1;
    if(n == 0) {
        for(a = 1; a < index; a++) printf("%d ", ans[a]);
        puts("");
        return ;
    }
    for(a = (n > ans[index-1]) ? ans[index-1] : n; a >= 1; a--)
        ans[index] = a, div(n-a, next);
}
main() {
    while(scanf("%d", &n) == 1)
        div(n, 1);
    return 0;
}

台長: Morris
人氣(3,804) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: ZeroJudge |
此分類下一篇:a054. 電話客服中心
此分類上一篇:d652. 貪婪之糊

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文