1

我正在尝试使一个随机数成为回文。例如,生成的随机数 1234 应该变成 12344321。

所以我写了这段代码:

int num = (int)((Math.random()*100000)+1);
int palindrome = num;

System.out.println(num);

while (num > 0)
{

    palindrome = palindrome*10+num%10;
    num = num/10;
}

System.out.println("Palindrome: " + palindrome);

有时它有效,例如,我得到数字 6540 和回文 65400456。但由于某种原因,在大多数情况下,我得到例如数字 94229 和回文 833057657。或者数字 82270 和回文 -362927364。

为什么会这样?这段代码有什么问题以及如何修复它?

谢谢!

4

3 回答 3

3

这是由于整数溢出。Anint为 32 位宽,因此仅限于 和 之间的-2,147,483,6482,147,483,647

94229个例子,9422992249(1<<32)833057657,这就是你得到的。

将 s更改intlongs,这将增加您的代码能够处理的数字范围(当然,范围将保持有限)。

如果您需要更进一步,BigInteger(或字符串)可能是答案。

于 2012-05-26T16:08:25.077 回答
3

您正在溢出,数字大于 2^31-1,这是整数的限制。尝试使用 long 代替。

于 2012-05-26T16:08:36.293 回答
1

是的,它不会工作。由于 int 数据类型是 32 位有符号二进制补码整数。它的最小值为 -2,147,483,648,最大值为 2,147,483,647(含)。对于整数值,此数据类型通常是默认选择,除非有理由(如上述)选择其他类型。这种数据类型很可能对于您的程序将使用的数字足够大,但如果您需要更广泛的值,请改用 long。

范围限制:

int -->    -2,147,483,648 to 2,147,483,647 
long -->   -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
于 2012-05-26T16:12:35.260 回答