2011-07-03 90 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

因为我认为它不太可能在实践中真正有用。 –