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,648ます2,147,483,647

例として94229、モジュロはであり、これが得られます。9422992249(1<<32)833057657

ints をs に変更longすると、コードで処理できる数値の範囲が広がります (もちろん、範囲は制限されたままです)。

さらに先に進む必要がある場合は、BigInteger(または文字列) が答えかもしれません。

于 2012-05-26T16:08:25.077 に答える
3

オーバーフローが発生しています。数値は整数の制限である 2^31-1 を超えています。代わりに long を使用してみてください。

于 2012-05-26T16:08:36.293 に答える
1

はい、動作しません。intデータ型は32ビットの符号付き2の補数整数であるため。最小値は-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 に答える