我正在编写一个应该执行功能的函数,但只显示指定的最后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位以下的计算。
谢谢!
答案 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。