【问题标题】:Predicting the number of digits of a multiplication预测乘法的位数
【发布时间】:2011-07-03 23:25:13
【问题描述】:

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

【问题讨论】:

  • 一般为2*n左右,其中n为位数。
  • 可以绑定位数如下:floor(log x)*floor(log y) <= digits(x*y) <= ceil(log x)*ceil(log y)log base 10。
  • @critobalito it more n+m 其中 n 和 m 是每个表达式的位数。例如9*9=81999*9=8991
  • @davin - 位数不只是floor(log(x) + log(y)) + 1,x, y 是正数吗?
  • 您需要的不是日志,而是 log10。看我的回答

标签: java math mathematical-optimization multiplication


【解决方案1】:

位数可以精确通过两个被乘数的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

这适用于任意大的数字。

【讨论】:

  • 这比我的回答好多了:)
  • 非常感谢大家的回复,但这个是最重要的。谢谢。
  • 当然,如果我们想要十进制数字的个数,只有log10。更一般地说,如果我们想要一个 base-k 位置系统中的数字,它是log_k
【解决方案2】:

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。

【讨论】:

  • 其他海报描述的以 10 为底的对数是一种简单的技术。但是,您可以找到以 2 为底的对数并乘以 (log 2)/(log 10),约为 0.693。只需找到二进制表示中最重要的 1 的位置,就可以在不求助于浮点的情况下找到以 2 为底的对数。如果您然后乘以 69 并整数除以 100,您应该找到近似的位数,而无需使用除整数运算之外的任何东西。您可能永远不应该这样做,因为它可能永远不会真正值得麻烦。不过很可爱,不是吗?
  • 为什么不在答案中添加您的评论?
  • 因为我认为它在实践中不太可能真正有用。
  • 我认为考虑到波西米亚人的答案,这个答案没有意义,因为您可以精确计算它,例如,“因此,如果您将 n 位数乘以 m 位数,则乘积将有 m+n-1 或 m+n 位。”是一个松散的界限,但你可以做得更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多