预测乘法的位数

Des*_*tes 8 java math mathematical-optimization multiplication

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

Boh*_*ian 22

可以通过两个被乘数的基数10日志的舍入(向下)和加上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");
}
Run Code Online (Sandbox Code Playgroud)

输出:

12345678901234567000 * 314159265358979 = 3878509413969699000000000000000000, which has 34 digits
Run Code Online (Sandbox Code Playgroud)

这适用于任意大数.

  • 当然,如果我们想要*十进制数*的话,它只是`log10`.更一般地说,如果我们想要base-k位置系统中的数字,那么它是`log_k`. (2认同)

Dom*_*cio 6

克里斯托瓦利托的回答几乎得到了它.让我更准确地说"约":

假设第一个数字有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.