2011-07-03 88 views
8

我需要找到非常大的乘法的位數(每個約300位數)。我想知道是否有一個技巧可以預測產品在沒有真正執行計算的情況下的位數。預測乘法的位數

+0

它通常約2 * n,其中n是數字的位數。 – cristobalito

+1

您可以如下限制位數:'floor(log x)* floor(log y)<= digits(x * y)<= ceil(log x)* ceil(log y)'log base 10. – davin

+0

@critobalito它更多n + m其中n和m是每個表達式的位數。例如'9 * 9 = 81'' 999 * 9 = 8991' – Lynch

回答

22

的位數可以由兩個被乘數的base 10 log加1的圓的(向下)和來計算準確,如下所示:

public static void main(String[] args) { 
    DecimalFormat f = new DecimalFormat("#"); 
    double num1 = 123456789d; 
    double num2 = 314159265358979d; 

    // Here's the line that does the work: 
    int numberOfDigits = (int) (Math.log10(num1) + Math.log10(num2)) + 1; 

    System.out.println(f.format(num1) + " * " + f.format(num2) + " = " + 
     f.format((num1 * num2)) + ", which has " + numberOfDigits + " digits"); 
} 

輸出:

123456789* 314159265358979 = 3878509413969699000000000000000000, which has 34 digits 

這將適用於任意大的數字。

+0

這比我的回答要好得多:) – Tom

+0

非常感謝你的迴應,但這個人需要你的迴應。謝謝。 – Deho

+2

當然,如果我們想要*十進制數字的數量*,它只是'log10'。更一般地說,如果我們想要一個base-k位置系統中的數字,它就是'log_k'。 –

6

Cristobalito的回答幾乎可以得到它。讓我使「約」更精確:

假設第一個數字有n個數字,第二個數字有m個。最低可分別爲10 ^(n-1)和10 ^(m-1)。該產品可能是最低的,並且將是10 ^(m + n-2),這是m + n-1個數字。

它們的最高值分別是10^n-1和10^m-1。該產品可能是最高的,並且將爲10 ^(n + m)-10^n - 10^m + 1,其最多具有m + n個數字。

因此,如果您將n位數乘以m位數,則產品將具有m + n-1或m + n個數字。

類似的邏輯適用於其他基地,如基地2.

+0

其他海報描述的基數爲10的對數是簡單的技術。但是,您可以找到基數2的對數並乘以(log 2)/(log 10),即大約0.693。通過在二進制表示中找到最重要的1的位置,可以發現基數2的對數而不求助於浮點。如果你乘以69和整數除以100,你應該找到大概的數字計數,而不用任何東西,但是整數運算。你可能永遠不應該這樣做,因爲它可能永遠不值得麻煩。可愛,但是,不是嗎? –

+0

爲什麼不把你的評論添加到答案? –

+0

因爲我認爲它不太可能在實踐中真正有用。 –