【问题标题】:Incorrect Multiplication [closed]不正确的乘法[关闭]
【发布时间】:2020-09-07 07:23:10
【问题描述】:

我正在尝试解决这个涉及基础数学的特殊问题。我的算法适用于所有其他测试用例,因此我知道它是正确的。但是对于其中一个测试用例中的一个特定输入,结果是错误的。我通过打印它们来检查值,值是:

a = 1000000000 and b = 999999999

当我这样做时

System.out.print(a*b); 

它返回 1808348672。

我试过这样做:

long ans = (long)a*b;
System.out.print(ans);

它仍然返回 1808348672

【问题讨论】:

  • 这是一个糟糕的副本——它没有回答这个问题。真正的问题是问题无法重现,因为 OP 的代码有效。
  • @Mureinik 请别管它。这里的整个问题是没有没有相关的casting。只是一个不可重现的问题。

标签: java math multiplication


【解决方案1】:

我试过这样做:

long ans = (long)a*b;
System.out.print(ans);

它仍然返回 1808348672

不,它没有:

class Foo {
    public static void main(String[] args) {
        int a = 1000000000;
        int b = 999999999;
        long ans = (long)a*b;
        System.out.print(ans);
    }
}
javac foo.java && java Foo
999999999000000000

你可能尝试的是

long ans = (long) (a*b);

这将首先执行整数乘法,然后将结果转换为long。这是行不通的,因为整数乘法在你的转换发生之前就溢出了。

【讨论】:

  • 我的错。我将 int 类型用于 ans 并尝试将 long 存储在 int 变量中。
  • @JaideepKular 如果没有另一个演员表就不会编译。
【解决方案2】:

abints,因此它们的乘法也将是 int,在被显式转换提升为 long 之前溢出。

您可以将它们定义为longs 或将它们单独转换为longs执行乘法之前。

【讨论】:

  • 它通过单​​独铸造每个人来工作。但是为什么我需要单独施放它们呢?我尝试投射整个操作,但没有成功。
  • @JaideepKular 转换结果为时已晚 - 将两个 int 相乘将产生一个 int,它在您转换之前已经溢出。如果您单独投射它们,您将乘以两个longs,这会产生一个long,它可以容纳结果而不会溢出。
猜你喜欢
  • 1970-01-01
  • 2020-06-23
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 2021-03-22
  • 2020-11-03
相关资源
最近更新 更多