challenge 自然数の分割

自然数nとm(n>=m>0)が与えられたとき,nをm個の非負の整数の和で表すやり方を全て出力してください.
その際,和の組(x_1, ..., x_m)は大きい順に出力してください.
ここでm = 3の時の「(a, b, c)が(A, B, C)より大きい」とは
(a > A)
(a == A) かつ (b > B)
(a == A) かつ (b == B) かつ (c > C)
のいずれかが成り立つとき(つまりは辞書的順序)とします.

例:n = 5, m = 3が与えられたときは
5, 0, 0,
4, 1, 0,
4, 0, 1,
3, 2, 0,
3, 1, 1,
...
0, 1, 4,
0, 0, 5,
を出力する.

Posted feedbacks - なでしこ

コードを生成してからそれを実行しています。

#mが大きくなると実行できませんorz

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
n=5
m=3

CODEとは文字列;TMPとは配列
(m)回
    CODE=CODE&リフレイン(タブ,回数-1)&"i{回数}で{n}から0まで繰り返す{~}"
CODE=CODE&リフレイン(タブ,m)&"もし("
(m)回
    TMPに"i"&回数を配列追加
T1=TMPを"+"で配列結合;T2=TMPを`&","&`で配列結合
CODE=CODE&T1&"={n})なら,("&T2&")を表示"
#CODEを表示
EVAL(CODE)

6進数に基数変換して合計がnになるものを表示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
n=5
m=3

t1="";t2=""
iで(6^m-1)から0まで繰り返す
    文字列分解(TOSTR(ゼロ埋め(DEC2SIX(i),m)))
    (m)回;t1=t1+_[回数-1];t2=t2&_[回数-1]&","
    バイト右端削除(t2,1)
    もし(t1=n)ならば,t2を表示
    t1="";t2=""

●DEC2SIX(x)
    sとは配列
    もし(x=0)ならば、"0"で戻る
    (x<>0)の間
        (x%6)をsに配列追加;x=INT(x/6)
    (sを配列逆順を""で配列結合)で戻る

すいませんボケてましたorzこれじゃnが5以外じゃ動かないですね;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
n=5
m=3

t1="";t2=""
iで((n+1)^m-1)から0まで繰り返す
    文字列分解(TOSTR(ゼロ埋め(DEC2X(i,n+1),m)))
    (m)回;t1=t1+_[回数-1];t2=t2&_[回数-1]&","
    バイト右端削除(t2,1)
    もし(t1=n)ならば,t2を表示
    t1="";t2=""

●DEC2X(x,y)
    sとは配列
    もし(x=0)ならば、"0"で戻る
    (x<>0)の間
        (x%y)をsに配列追加;x=INT(x/y)
    (sを配列逆順を""で配列結合)で戻る

Index

Feed

Other

Link

Pathtraq

loading...