Превращение случайного числа в палиндром с помощью Java

Я пытаюсь сделать случайное число палиндромом. Например, сгенерированное случайное число 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.

Почему это происходит? Что не так с этим кодом и как его исправить?

Спасибо!


person Igal    schedule 26.05.2012    source источник


Ответы (3)


Это связано с целочисленным переполнением. int имеет ширину 32 бита и поэтому ограничен значениями от -2,147,483,648 до 2,147,483,647.

Если взять 94229 в качестве примера, 9422992249 по модулю (1<<32) равно 833057657, что вы и получаете.

Измените ints на longs, и это увеличит диапазон чисел, которые ваш код сможет обрабатывать (диапазон, конечно, останется ограниченным).

Если вам нужно пойти еще дальше, BigInteger (или строки) могут быть ответом.

person NPE    schedule 26.05.2012
comment
Ага, это сработало. Большое спасибо! PS. Я не могу принять ответ в течение следующих 8 минут или сеять (не знаю почему), но сделаю это, как только смогу. - person Igal; 26.05.2012

Вы получаете переполнение, числа больше 2 ^ 31-1, что является пределом для целых чисел. Попробуйте вместо этого использовать длинный.

person CBredlow    schedule 26.05.2012
comment
Предел составляет 2 ^ 31 - 1 из-за подписи. - person Christoffer Hammarström; 26.05.2012

Да не сработает. Поскольку тип данных 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
person Siva Charan    schedule 26.05.2012