预测乘法的位数

时间:2011-07-03 23:25:14

标签: java math mathematical-optimization multiplication

我需要找到非常大的乘法(每个约300位)的位数。我想知道是否有一个技巧可以预测产品没有实际执行计算的位数。

2 个答案:

答案 0 :(得分:22)

可以通过两个被乘数的base 10 log加上1的舍入(下)总和来计算完全的位数,如下所示:

public static void main(String[] args) {
    DecimalFormat f = new DecimalFormat("#");
    double num1 = 12345678901234567890d;
    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");
}

输出:

12345678901234567000 * 314159265358979 = 3878509413969699000000000000000000, which has 34 digits

这适用于任意大数字。

答案 1 :(得分: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。