当前位置: 首页 > 知识库问答 >
问题:

将两个整数相乘的结果存储在长

孙嘉
2023-03-14

我解决了一个编程问题,如果有两个数字A和B,我必须在乘积的二进制形式中找到1的个数。A和B的范围是[0,10^9]包括在内。这是我写的代码。

public class Solution {
public static void main(String[] args) {
// System.out.println(solution(32329,4746475));
    System.out.println(solution(3,4));
}

 public static int solution(int A, int B) {
        // write your code in Java SE 8
        long mul=A*B;
        int ans=0;
        while(mul>0)
        {
            if((mul%2)!=0)
            {
                ans++;
            }
            mul=mul/2;
        }
        return ans;
    }
}

这对输入(3,4)很有效,但当我尝试(323294746475)作为输入时,代码不起作用,结果显示0作为答案。我在不同的地方放了几个输出语句进行调试,发现有了这个输入,乘法的结果是-1170032381(这是错误的),因此while循环的条件失败。所以,我像这样对A和B进行了打字

long mul=(long)A*(long)B;

瞧,它起作用了。现在,我的问题是为什么?为什么代码对较小的输入运行良好,对较大的输入运行失败,并且在Java中不应该“int to long”是隐式类型转换?

(我还尝试了其他一些输入,因此并非所有较大的输入都给出负数作为乘积,但它们也没有给出正确的答案,较小的输入我一直尝试,直到5位a和B给出正确的乘积)

共有2个答案

松高爽
2023-03-14

Java int可以从

-2147483648 to 2147483647

32329 X 4746475 =153448790275

由于Java在隐式转换之前进行乘法,结果是错误的

颛孙哲
2023-03-14

Java自动从int扩展到long,但这是在赋值时发生的,但是一个int与另一个int相乘会产生一个int,所以你会得到整数溢出,首先将3232947464746475相乘,然后将溢出的int结果扩大到long

但是,如果您首先将至少一个int转换为long,那么乘法是使用long完成的,结果是long,因此不会出现整数溢出。

 类似资料:
  • 该方法通过用户的输入获取给定数据集中的两个最大整数,并计算它们的乘积。它对每个输入都很有效,直到我尝试了两个整数和的数组,它返回。 这是我的Java方法: 这是我的方法:

  • 想象我们有两个数组: 获取包含两者相乘值的第三个String数组的更好方法是什么?比如: 我知道,我可以使用循环并将1中的每个元素与2中的每个元素连接起来,并将结果放入3中。但实际上和中的元素要多得多。Java中是否有专门的工具使其更有效?

  • 有人请解释一下。为什么下面的程序产生16个?

  • 问题内容: 我有一张桌子 提供值后,需要计算为 我想乘和列并将结果存储在同一表的列中。 我已经试过了: 但是失败了! 有人请帮助我实现这一目标。 问题答案: 尝试更新表格

  • 我有一个PySpark数据帧,df1,看起来像: 我有第二个PySpark数据帧,df2 我想将df1的所有列(我有两列以上)与客户ID上的df2连接值相乘

  • 问题内容: 我想长时间存储两个整数(而不是每次都必须创建一个新对象)。 目前,我已经尝试过了。它不起作用,但是我不知道这是怎么回事: 我得到这样的int值: 问题答案: 在第一个代码段中正进行符号扩展,这会在任何时候被覆盖。 在第二个代码段中,对的强制转换在转换之前完成,因此实际上获得的值。