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 - JavaScript

push とか unshift は元の配列を返してくれれば便利なのに。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
function doukaku89(n, m){
  if(--m < 1) return [[n]];
  for(var r = [], i = n, x = 0; i >= 0; i--)
    for(var a = arguments.callee(n - i, m), j = 0, l = a.length; j < l; j++)
      r[x++] = (a[j].unshift(i), a[j]);
  return r;
}

(typeof alert != 'undefined' ? alert :
 typeof print != 'undefined' ? print :
 function($){ typeof WSH == 'object' && WSH.echo($) })(doukaku89(5, 3).join('\n'))

Index

Feed

Other

Link

Pathtraq

loading...