Редакция для Переворот числа


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Автор: montes332

1. Идея

Нужно развернуть цифры числа в обратном порядке.

Самый удобный способ — брать у числа последнюю цифру и постепенно строить новое число:

  • последняя цифра находится как n % 10;
  • удалить последнюю цифру можно как n // 10 в Python или n /= 10 в C++;
  • если добавлять извлечённые цифры справа к ответу, то как раз получится перевёрнутая запись.

Например, для 1200:

  • берём 0, ответ становится 0;
  • берём 0, ответ остаётся 0;
  • берём 2, ответ становится 2;
  • берём 1, ответ становится 21.

Именно это и нужно вывести.

2. Наблюдения

  1. Если число n = 0, то ответ тоже 0. Цикл по цифрам в таком случае не выполнится ни разу, поэтому этот случай удобно обработать отдельно.

  2. При перевороте ведущие нули исчезают автоматически. Например, у числа 1200 после переворота должно получиться 21, а не 0021. Если строить ответ как число, а не как строку, то никакие ведущие нули не сохранятся.

  3. Чтобы добавить очередную цифру справа к уже построенному числу result, нужно:

    • сначала сдвинуть result на один десятичный разряд влево: result * 10;
    • затем прибавить новую цифру.

    То есть: result = result * 10 + последняя_цифра.

3. Алгоритм

  1. Считать число n.
  2. Если n == 0, вывести 0.
  3. Иначе:
    • завести переменную result = 0;
    • пока n > 0:
      • взять последнюю цифру: n % 10;
      • дописать её к ответу: result = result * 10 + n % 10;
      • убрать последнюю цифру из n: n //= 10 в Python или n /= 10 в C++.
  4. Вывести 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)

Комментарии

Еще нет ни одного комментария.