获取大数的最后13位数

时间:2012-07-14 04:06:05

标签: javascript math

我正在编写一个应该执行功能的函数,但只显示指定的最后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位数字和较低的工作正常):

如果我做电(999,999,1)我最终得到=&gt; 9

如果我做电(999,999,5)我最终得到=&gt; 98999

如果我做电(999,999,12)我最终得到=&gt; 000499998999

这是它开始搞乱的地方:

如果我做电(999,999,13),我最终得到=&gt; 5710054009000

如果我做电(999,999,14),我最终得到=&gt; '79077027006000'

起初我以为我正在达到某种整数限制,科学记数法正在搞砸,但我不认为是这种情况,因为它最多可以达到20位数。

我怀疑我在if语句中减少字符串的方式有问题。但我不确定为什么它不会搞砸13位以下的计算。

谢谢!

1 个答案:

答案 0 :(得分:2)

你需要一个函数来计算b ^ e(mod m)。一个好的算法称为square and multiply

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。