0

累乗を行うはずの関数を書いていますが、指定された最後の n 桁のみを表示します。それはうまく機能しています...ほとんど。なんらかの理由で、必要な最後の桁の数を指定すると、12 までは正常に機能します。12 を超える桁数では、非常に奇妙な数値が得られるようです。明らかな何かが欠けているに違いないことはわかっていますが、実際にはわかりません。

コードは次のとおりです。

function power(base, exponent, digits) {
total = base;
for(i = 1; i < exponent; i++) {
    total =  total * base;

    if(total.toString().length > digits)  {
        total = total.toString().substr(total.toString().length - digits, digits);
        }
    }

return total;
}

したがって、いくつかの例 (12 桁以下の表示は問題なく動作します):

power(999, 999, 1) を実行すると => 9 になります

power(999, 999, 5) を実行すると、=> 98999 になります。

power(999, 999, 12) を実行すると、 => 000499998999 になります

ここで混乱が始まります:

power(999, 999, 13) を実行すると、 => 5710054009000 になります

power(999, 999, 14) を実行すると、 => '79077027006000' になります

最初は、ある種の整数制限に達していて、科学的表記法が問題を引き起こしていると思っていましたが、20 桁までは機能するはずなので、そうではないと思います。

if ステートメントで文字列を減らす方法に問題があると思われます。しかし、13 桁未満の計算でなぜ台無しにならないのか、私にはわかりません。

ありがとう!

4

1 に答える 1

2

b ^ e(mod m)を計算する関数が必要です。優れたアルゴリズムは、2乗と乗算として知られています。

Algorithm PowerMod: Compute b^e (mod m) with b, e and m all positive integers.
1. [Initialize] Set r := 1.
2. [Terminate when finished] If e == 0, return r and stop.
3. [Multiply if odd] If e is odd, set r := r * b (mod n).
4. [Square and iterate] Set e := floor(e / 2). Set b := b * b (mod n). Go to Step 2.

次に、計算を行うために、PowerMod(999、999、10 ^ 14);と言います。17000499998999を取得する必要があります。

于 2012-07-16T12:59:46.860 に答える