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

将两个大整数值相乘得到的结果不正确

凤棋
2023-03-14

方法通过用户的输入获取给定数据集中的两个最大整数,并计算它们的乘积。它对每个输入都很有效,直到我尝试了两个整数10000090000的数组,它返回410065408

这是我的Java方法:

static int getMaxPairwiseProduct(int[] numbers) {
    int max=0,lessermax=0;
    int n = numbers.length;

    for (int j = 0; j < n; ++j) {
        //if(j==k)continue;
        if(numbers[j]>0 && numbers[j]>=max) {               
            lessermax=max;max=numbers[j];
            System.out.println(j);//k=j;
        } else if(numbers[j]>lessermax) {      
            lessermax=numbers[j];
            System.out.println(j);}
        }
    //result=;
    return max*lessermax;
}

这是我的main方法:

public static void main(String[] args) {
    //FastScanner scanner = new FastScanner(System.in);
    Scanner scanner=new Scanner(System.in);
    int n = scanner.nextInt();
    int[] numbers = new int[n];
    for (int i = 0; i < n; i++) {
        numbers[i] = scanner.nextInt();
    }
    scanner.close();
    System.out.println(getMaxPairwiseProduct(numbers));
}

共有1个答案

章远航
2023-03-14

它会溢出int的容量,并且会绕圈。100000*900009000000000int的最大正值为2^31-1,即2147483647(略小于9000000000的四分之一)。

如果需要这两个数字的乘积,则需要使用long

100000L * 90000L = 9000000000L = 0x218711a00L

对于32位数据类型,32位(8个十六进制数字)以外的任何数据都会因为溢出而被截断。因此保留的值为:0x18711A00==410065408

 类似资料:
  • 我解决了一个编程问题,如果有两个数字A和B,我必须在乘积的二进制形式中找到1的个数。A和B的范围是[0,10^9]包括在内。这是我写的代码。 这对输入(3,4)很有效,但当我尝试(323294746475)作为输入时,代码不起作用,结果显示0作为答案。我在不同的地方放了几个输出语句进行调试,发现有了这个输入,乘法的结果是-1170032381(这是错误的),因此while循环的条件失败。所以,我像

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

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

  • 看看以下片段: 结果如下: 无符号短常量

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

  • 输出如下:http://imgur.com/a/nu3n6