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)
这适用于任意大数.
克里斯托瓦利托的回答几乎得到了它.让我更准确地说"约":
假设第一个数字有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.