Java简单算法的问题

Java简单算法的问题,java,Java,我正在开发一个小型Java程序,在某个地方,我的计算出错了。我的代码如下: import java.io.*; import java.util.*; import java.text.*; public class NumManip { public static void main(String args[]) { Scanner numGetter = new Scanner(System.in); final int MULT_1 =

我正在开发一个小型Java程序,在某个地方,我的计算出错了。我的代码如下:

import java.io.*;
import java.util.*;
import java.text.*;

public class NumManip
{

    public static void main(String args[])
    {

        Scanner numGetter = new Scanner(System.in);
        final int MULT_1 = 9;
        final int MULT_2 = 12345679;
        final int MULT_3 = 1000;
        int poorHatedNumber;

        System.out.print("Enter a digit between 1 and 9 that you dislike: ");
        poorHatedNumber = numGetter.nextInt();
        int num1 = poorHatedNumber * MULT_1, num2 = num1 * MULT_2;
        long num3 = num2 * MULT_3;

        System.out.println();

        System.out.println("           " + poorHatedNumber);
        System.out.println("          " + "x" + MULT_1);
        System.out.println("          __");
        System.out.println("          " + num1);
        System.out.println("   x" + MULT_2);
        System.out.println("          __");
        System.out.println("   " + num2);
        System.out.println("       x" + MULT_3);
        System.out.println("____________");
        System.out.println(num3);

    }

}

我试着在屏幕上打印num1、num2和num3,看看问题出在哪里,num1是对的,num2是对的,num3是反常的。我的输入是9,第一次计算乘以9得到81。然后乘以12345679得到9999999,再乘以1000得到-727380968。最后一步怎么了?我对Java真的很陌生,我不明白这个问题。

<9999999*12345679=1.234567898765432e+16远大于
int
的最大值2147483647

由于Java使用(表示当数字为负数时打开最左边的位),因此该计算“溢出”(结转)到该位,从而导致负数结果


对于使用如此大的数字进行计算,您应该使用

<99999999*12345679=1.234567898765432e+16,这远远大于
int
的最大值2147483647

由于Java使用(表示当数字为负数时打开最左边的位),因此该计算“溢出”(结转)到该位,从而导致负数结果


对于这样大的数字的计算,您应该使用

,因为num2和num1都是整数,所以发生了整数乘法,它超过了整数值的最大值

long num3 = (long)num2 * MULT_3;

由于num2和num1都是整数,因此发生了整数乘法,并且它超过了整数值的最大值

long num3 = (long)num2 * MULT_3;

我认为你得到的数字比数据类型所能处理的要大,当数据类型被签名时,它会变成负数。

我认为你得到的数字比数据类型所能处理的要大,当数据类型被签名时,它会变成负数。

别担心,这真的不是一个愚蠢的错误。整个“数字通常是固定大小的”——这项交易最初让几乎所有人都感到困惑。现在你知道怎么回事了,还有更奇怪的事。这并不是你问题的答案,但现在你已经看到了一个“坏溢出”的例子,你可能会发现这很有趣


考虑一个奇数
x
。有一个数字
y
,使得
x*y==1
。这个数字
y
被称为the,它可以很容易地计算出来(参见Hacker's Delight,被常数精确除法)。这似乎真的违反直觉,因为它本质上允许一种奇怪的“除法”,只有当数字是除数的精确倍数时才有效,而且通常它允许您“撤消”奇数乘法。例如,如果你有
a=3*b
,那么
b=-1431655765*a
——不管两个乘法中是否有溢出,所以溢出不必是“破坏性的”。

别担心,这真的不是一个愚蠢的错误。整个“数字通常是固定大小的”——这项交易最初让几乎所有人都感到困惑。现在你知道怎么回事了,还有更奇怪的事。这并不是你问题的答案,但现在你已经看到了一个“坏溢出”的例子,你可能会发现这很有趣


考虑一个奇数
x
。有一个数字
y
,使得
x*y==1
。这个数字
y
被称为the,它可以很容易地计算出来(参见Hacker's Delight,被常数精确除法)。这似乎真的违反直觉,因为它本质上允许一种奇怪的“除法”,只有当数字是除数的精确倍数时才有效,而且通常它允许您“撤消”奇数乘法。例如,如果你有
a=3*b
,那么
b=-1431655765*a
——不管两次乘法中是否有溢出,所以溢出不必是“破坏性的”。

相关的——这是一个愚蠢的错误。非常感谢你!相关-嗯,那是一个愚蠢的错误。非常感谢你!