JavaScript | 【報告も】単発質問@JavaScript part3 | 229 回答例

おれはあたまわるいので、http://haxe.no-ip.org/ro/comb.html をどうぞ。

消された。

筆算的

近似です。JavaScript の有効精度の範囲しかでません。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<title>二項係数</title>
<script type="text/javascript">// <![CDATA[
function factorize(n) {
  if (n === 1) return [n];
  if (n <= 0 || n !== Math.floor(n)) return false;

  for (var i, m, l = 2, a = [];;) {
    i = l;
    m = Math.sqrt(n + 0.5);

    while (i <= m) {
      if (n % i === 0) {
        a.push(i);
        break;
      }
      i++;
    }

    if (i > m) {
      a.push(n);
      return a;
    }

    l = i;
    n /= i;
  }
}

function comb(n, r) {
  n = new Number(n);
  r = new Number(r);
  if (n < r) return 0;
  if (n === r) return 1;
  if (r === 1) return n;

  for (var a = [], b = [], i = 0; i < r; i++) {
    a.push.apply(a, factorize(n - i));
    b.push.apply(b, factorize(r - i));
  }

  for (var c = 1, i = 0, a_len = a.length; i < a_len; i++) {
    for (var j = 0, b_len = b.length; j < b_len; j++)
      if (a[i] === b[j]) {
        a.splice(i, 1, 1);
        b.splice(j, 1);
        break;
      }
    if (a[i] !== 1) {
      c *= a[i];
      if (c === Number.POSITIVE_INFINITY) break;
    }
  }
  return c;
}

var s = '整数を入力してください。';
var n = prompt(s, 100);
var r = prompt(s, 6);
var c = comb(n, r);
document.write(['<a href="http://www.google.co.jp/search?q=', n, '+choose+', r, '=" target="_blank">'].join(''));
document.write(['<sub>', n, '</sub>C<sub>', r, '</sub> = ', c].join(''));
document.write('</a>');
// ]]></script>

BigInt.js

http://soudan1.biglobe.ne.jp/qa3543321.html の回答番号:No.7 とは一致するから、まあよさそうでしょうか……

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<title>二項係数</title>
<script type="text/javascript" charset="shift_jis" src="BigInt.js"></script>
<script type="text/javascript">// <![CDATA[
var s = '整数を入力してください。';
var n = prompt(s, 100);
var r = prompt(s, 6);
var n_ = new BigInt(n);
var r_ = new BigInt(r);
var d = new BigInt('1');
for (var i = new BigInt('1'), l = r_.clone(); bigint_cmp(l, i) === 1; i = bigint_plus(i, d)) {
  n_ = bigint_mul(n_, bigint_minus(n, i));
  r_ = bigint_mul(r_, bigint_minus(r, i));
}
var c = bigint_div(n_, r_);
document.write(['<a href="http://www.google.co.jp/search?q=', n, '+choose+', r, '=" target="_blank">'].join(''));
document.write(['<sub>', n, '</sub>C<sub>', r, '</sub> = ', c].join(''));
document.write('</a>');
// ]]></script>
n: 10000, r: 3000
77578708414622781919184089365853843098672731962523453409968751787633293257691437779648342779636837348257661278020246468978424504486063764431993264812099886855642805366567468224545687001100289521502310947898048189264907149430829075087126757760970600128136307191477472836543587696792303287128651789677102700955487241433699252190405947235989597133154589524966041573707030924085670532503399822727233329549509080309938930678718634679989765925137304694732383276086233489774647579212642885578743907836354019701783883048023872206622806636352045276069616724975579837711775366289529689029117789401577125561421086852340165718843028182271868548389210265623855037171047970471916148908394143078836565457811483937138688658428843309307648201538869279089975997921408491177067667611792575679011657080668803280848189309515578008732412419137279234811308177803979352145203295182155827794313691092976729791730985798111860221490211533734012384256104068797257299270636324189556939474629411781084725425913515068172351801315118208125402060325840725900500604082184865351060840421109952628835568877752553530241881249376104101545415870730219285988925821947903601556995170153620169529150078283356127291891288910266808547589720394105911344257379277304549575049354285576843730220694295275435485251033346293408317927913371677359912095741342849009790373887254153530026440866752537063007569586890149115531439818588979444670166834027103334802508618943389787854659991093524667093991139230457632005685109254296862862826621766815964756364190444633813355612593367357401369122209408515076055502350536009606559041119797261708529457659062317317152317944204773452754975187892029931879905967833346677414514111252909397747428826679839888112128175195018049063902123230517964865415017075715173083126695073092129268520591369982547135322037208785944746424426000688505303970635613067339979939953172057819207596842814523372590377578302876910631453275829919852561667815626690325720395145676223982087510693989808055283808938171380053608991466724348163261760422311385729973653146174170295046868447793594776171595029693596313173076609940410894195550973272473540621600521540201374449682094174763326534265020448669547304892857748211091972028737309834508503333952623674119987540629556228390883273717156114799538356170542580669860506374367432932863453630596067494731613579604848504562787021006475265029729171072949615077945922191058312506985468796476484190083717582220249017921906106011522284298198930211499275805765495010980922961271399465492855261725792866382239669622113185827382786669680964488190533819017404919095222763574499667853184977595133044511925342976298783924294544799815303065588659246595943283200