2012-07-14 79 views
0

我正在寫一個應該做權力的函數,但只顯示指定的最後n位數。它的工作很棒......主要是。由於某些原因,當我指定了我想要的最後幾位數字時,它一直工作到包括數字12在內.12以上的任何數字似乎給我一個非常奇怪的數字。我知道我必須錯過一些明顯的東西,但我真的沒有看到它。獲取大數的最後13位數

下面是代碼:

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)我結束了=> 9

如果我做電源(999,999,5)我最終=> 98999

如果我做電源(999,999,12)我最終=> 000499998999

這裏是它開始搞亂:

如果我做電源(999,999,13)我最終=> 5710054009000

如果我做電源(999,999,14)餘結束'='79077027006000'

起初我以爲我打了某種整數限制和科學記數法是搞砸了,但我不認爲是這樣,因爲它應該工作到20位數字。

我懷疑這是我在減少if語句中的字符串的方式有問題。但我不確定爲什麼它不會搞亂13位數以下的計算。

謝謝!

+3

你知道IEEE 794浮點是如何工作的嗎? – Pointy 2012-07-14 04:07:05

+0

我有一些想法。但我不認爲它會失去13位數的精確度。我的功能背後的想法是永遠不要讓它與高數字一起工作。它從不乘以任何高於第13位的數字。 – renosis 2012-07-14 04:25:26

+6

@renosis 13位數字乘以3位數字是(最多)16位數字。雙精度浮點數只能精確到15位數。 – 2012-07-14 05:57:10

回答

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.

+0

我試過了,我必須在這裏丟失一些東西。這不會給20位數以上的值。我只是將不得不將每一個計算轉換爲一個字符串,這個字符串可以用於我計算的每個地方,不是嗎? – renosis 2012-07-19 01:40:12

+0

PowerMod算法是正確的。您需要一個大整數庫,它不會限制您可以計算的整數範圍。我不知道JavaScript,所以我不能告訴你是否內置了大整數,或者有可用的庫提供大整數。 – user448810 2012-07-19 12:54:38