Редакция для Переворот числа
Submitting an official solution before solving the problem yourself is a bannable offence.
Автор:
1. Идея
Нужно развернуть цифры числа в обратном порядке.
Самый удобный способ — брать у числа последнюю цифру и постепенно строить новое число:
- последняя цифра находится как
n % 10; - удалить последнюю цифру можно как
n // 10в Python илиn /= 10в C++; - если добавлять извлечённые цифры справа к ответу, то как раз получится перевёрнутая запись.
Например, для 1200:
- берём
0, ответ становится0; - берём
0, ответ остаётся0; - берём
2, ответ становится2; - берём
1, ответ становится21.
Именно это и нужно вывести.
2. Наблюдения
Если число
n = 0, то ответ тоже0. Цикл по цифрам в таком случае не выполнится ни разу, поэтому этот случай удобно обработать отдельно.При перевороте ведущие нули исчезают автоматически. Например, у числа
1200после переворота должно получиться21, а не0021. Если строить ответ как число, а не как строку, то никакие ведущие нули не сохранятся.Чтобы добавить очередную цифру справа к уже построенному числу
result, нужно:- сначала сдвинуть
resultна один десятичный разряд влево:result * 10; - затем прибавить новую цифру.
То есть:
result = result * 10 + последняя_цифра.- сначала сдвинуть
3. Алгоритм
- Считать число
n. - Если
n == 0, вывести0. - Иначе:
- завести переменную
result = 0; - пока
n > 0:- взять последнюю цифру:
n % 10; - дописать её к ответу:
result = result * 10 + n % 10; - убрать последнюю цифру из
n:n //= 10в Python илиn /= 10в C++.
- взять последнюю цифру:
- завести переменную
- Вывести
result.
4. Почему это работает
Докажем идею по шагам.
Пусть в какой-то момент у числа n ещё остались необработанные цифры, а в result уже записаны в правильном порядке все цифры, которые были сняты с конца исходного числа.
На очередном шаге:
n % 10даёт последнюю цифру текущего числаn;- именно она должна идти следующей в перевёрнутой записи;
- операция
result = result * 10 + n % 10приписывает эту цифру справа к уже собранной части ответа; - затем
n /= 10илиn //= 10удаляет эту цифру из исходного числа.
Так повторяется, пока цифры не закончатся.
Когда цикл завершился, все цифры исходного числа были взяты по одной, начиная с конца, и в том же порядке записаны в result. Значит, result и есть число с перевёрнутой записью.
Почему пропадают ведущие нули после переворота?
Потому что ответ хранится как обычное число. Например, если сначала в result добавились несколько нулей, значение всё равно остаётся 0, а затем появляются значащие цифры. Поэтому запись вроде 0021 автоматически становится числом 21.
5. Сложность
Пусть у числа n ровно k цифр.
- Время работы:
O(k), потому что каждая цифра обрабатывается один раз. - Память:
O(1), используются только несколько переменных.
6. Код на C++17
#include <iostream>
using namespace std;
int main() {
unsigned long long n;
cin >> n;
if (n == 0) {
cout << 0;
return 0;
}
unsigned long long result = 0;
while (n > 0) {
result = result * 10 + (n % 10);
n /= 10;
}
cout << result;
return 0;
}
7. Код на Python 3
n = int(input())
if n == 0:
print(0)
else:
result = 0
while n > 0:
result = result * 10 + n % 10
n //= 10
print(result)
Комментарии