1

に階乗実装を書こうとしていnode.jsます。非常に単純な再帰的アプローチから最も複雑なアルゴリズムまで。コードは次のとおりです。

process.stdin.resume();

var i = 0, t = 0;

process.stdin.on('data', function (n) {
    if (t == 0) {
        t = n;
    } else {
        if (i++ < t) {
            process.stdout.write(Factorial(n).toString());
            if (i == t) {
                process.exit();
            }
        } else {
            process.exit();
        }
    }
});

function Factorial (n) {
    if (n > 1) {
        n *= Factorial(n - 1);
    }
    return n;
}

問題は — 数字の表現です。私は正確な答えを期待しています:

100! = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

しかし、私はより論理的ですが、現時点では役に立たないものを受け取っています:

100! = 9.33262154439441e+157

階乗のバイナリ表現は正しいと思いますが、どうすればそれを「緩い」形式にすることができますか?

4

1 に答える 1

2

次のいずれかを使用できます。

これらのいずれかに基づいて階乗を計算する関数を実装するのは、非常に簡単です。その場合、メモ化を使用して全体的なパフォーマンスを向上させることができます。これは、大きな整数をサポートしない基本的な実装です。

var MEMOIZED_FACT = [];

function FACT(number) {
  var n = Math.floor(number);
  if (n === 0 || n === 1) {
    return 1;
  } else if(MEMOIZED_FACT[n] > 0) {
    return MEMOIZED_FACT[n];
  } else {
    return MEMOIZED_FACT = FACT(n - 1) * n;
  }
}
于 2013-01-30T00:03:42.133 に答える