1. Обзор
В этом уроке мы увидим, как инвертировать число, используя математический подход в Java. Сначала мы увидим, какие математические операции необходимы для этого, а затем рассмотрим три различных способа реализации.
2. Подход к решению
Для начала давайте возьмем пример и посмотрим, что именно должно произойти. Например, мы хотим, чтобы число 1234 стало 4321. Этого можно добиться с помощью следующего подхода:
- получить последнюю цифру числа
- мы можем применить модуль, чтобы получить последнюю цифру
- 1-я итерация – 1234 % 10 = 4
- 2-я итерация – 123 % 10 = 3
- умножьте обратное число на 10 и добавьте цифру, найденную на предыдущем шаге
- 1-я итерация — 0 * 10 + 4 = 4 (поскольку для начала нет перевернутого числа, мы умножаем на 0 в 1-й итерации)
- 2-я итерация – 4*10+3=43
- разделите исходное число на 10 и повторите с шага 1 и продолжайте, пока число не станет 0
- 1-я итерация — 1234/10 = 123
- 2-я итерация – 123/10=12
3. Математическая реализация
Мы хотим перевести математические операции выше в код. Это возможно тремя различными способами: с помощью цикла while
, цикла for
или рекурсии.
Приведенные ниже подходы также учитывают отрицательные значения, используя абсолютное значение числа, которое необходимо обратить, и умножив обращенное число на -1, если исходное число отрицательное.
3.1. пока
цикл
Цикл while
находится первым в списке, так как это самый понятный способ перевода математических операций выше:
int reversedNumber = 0;
int numberToReverse = Math.abs(number);
while (numberToReverse > 0) {
int mod = numberToReverse % 10;
reversedNumber = reversedNumber * 10 + mod;
numberToReverse /= 10;
}
return number < 0 ? reversedNumber * -1 : reversedNumber;
3.2. для
цикла
При использовании цикла for
логика такая же, как и раньше. Мы пропускаем оператор инициализации цикла for
и используем число, которое переворачивается в завершающем условии:
int reversedNumber = 0;
int numberToReverse = Math.abs(number);
for (; numberToReverse > 0; numberToReverse /= 10) {
int mod = numberToReverse % 10;
reversedNumber = reversedNumber * 10 + mod;
}
return number < 0 ? reversedNumber * -1 : reversedNumber;
3.3. Рекурсия
Для рекурсии мы можем использовать метод-оболочку, который вызывает рекурсивный метод, возвращающий перевернутое число:
int reverseNumberRecWrapper(int number) {
int output = reverseNumberRec(Math.abs(number), 0);
return number < 0 ? output * -1 : output;
}
Метод рекурсии реализует математические операции так же, как и в предыдущих примерах:
int reverseNumberRec(int numberToReverse, int recursiveReversedNumber) {
if (numberToReverse > 0) {
int mod = numberToReverse % 10;
recursiveReversedNumber = recursiveReversedNumber * 10 + mod;
numberToReverse /= 10;
return reverseNumberRec(numberToReverse, recursiveReversedNumber);
}
return recursiveReversedNumber;
}
Рекурсивный метод возвращает текущее обращенное число на каждой итерации, а число, подлежащее обращению, укорачивается с каждой итерацией. Это происходит до тех пор, пока число, которое нужно перевернуть, не станет равным 0, и в этот момент мы возвращаем полностью перевернутое число.
4. Вывод
В этой статье мы рассмотрели три различных реализации обращения числа с использованием цикла while
, цикла for
и рекурсии.
Как всегда, исходный код примеров доступен на GitHub .