Как перевернуть число в C/C++

Как перевернуть число в C/C++

19 марта 2022 г.

Фото 愚木混株 cdd20 на Unsplash


Абстрактный


Обратное число в программе C/C++ означает перестановку цифр, т.е. поставить последнюю цифру данного числа на первую позицию или наоборот.


Область статьи


  • В этой статье представлены основные сведения об обращении числа и алгоритме для него.

  • Различные методы реализации одного и того же в C.

Предпосылки


  • Необходимо иметь базовые знания C/C++

  • Понимание того, как работают циклы и рекурсии.

Введение


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


==Давайте разберемся с этим на примере:-==


==Введено 56897.==


==Тогда реверс данного числа будет 79865.==


Поскольку мы поняли, что подразумевается под обращением числа, давайте углубимся в понимание его алгоритма.



Алгоритм обращения числа в C


Шаг 1. Предположим, что данное число равно 5689. Рассмотрим обратный номер как rev_num =0.


Шаг 2. Теперь воспользуемся данной формулой, т.е.


номер_обновления = номер_осмотра*10 + номер%10;


число = число / 10;


Как мы видим, каждый раз, когда мы извлекаем последнюю цифру заданного числа и размещаем эту последнюю цифру в rev_num, умножая ее на 10.


Чтобы избежать извлечения одной и той же последней цифры из num, мы обновим num, разделив его на 10 и сохранив это значение в num.


Шаг 3 . Мы будем продолжать процедуру до тех пор, пока заданное число не станет меньше или равно 0.


Как только мы достигли этой стадии, мы получили обратное число.


В приведенном выше примере после 5-й итерации мы получим обратный номер, т.е. 79865.


| Цифра извлечена из num | Умножение на 10, т.е. rev_num |


| 7 | 0*10+ 7 =7 |


| 9 | 7*10 +9 = 79 |


| 8 | 79*10+8 = 798 |


| 6 | 798*10+6=7986 |


| 5 | 7986*10+5=79865 |


Разные методы реализации одного и того же на C


Здесь мы используем 2 арифметических оператора, а именно по модулю и оператор деления.


Итеративный метод обращения числа


```нажмите


включить


интервал основной () {


int num, rev_num = 0 , rem ;


prinf("введите число, которое вы хотите поменять местами:");


scanf("%d",&num);


// используем цикл while и уменьшаем num до num >= 0


в то время как (число! = 0) {


рем = число %10 ;


rev_num = (rev_num *10) + rem;


число = число/ 10 ; //обновление числа делением на 10


printf ("обратное значение данного числа %d: %d", num , rev_num);


вернуть 0;


Выход


```нажмите


введите номер, который вы хотите отменить: 54689


обратная сторона данного числа 54689: 98645


Рекурсивная реализация обращения числа


```нажмите


включить


int reversenumber(int n, int revnum){


если (n==0) вернуть revnum;


вернуть обратное число (n/10, n % 10 + k*10);


интервал основной () {


целое число, rev_num ;


prinf("введите номер, который вы хотите перевернуть");


scanf("%d",&num);


//вызов рекурсивной функции reversenumber


rev_num = обратный номер (число, 0);


printf ("обратное значение данного числа %d: %d", num , rev_num);


вернуть 0;


Выход


```нажмите


введите номер, который вы хотите отменить: 54689


обратная сторона данного числа 54689: 98645


Объяснение


  • В рекурсивной функции revnum представляет собой обратную сторону заданного числа.

  • Мы поставили условие, что если данное число, представленное «n», станет нулем, то мы вернем наше обратное число.

  • Во всех остальных случаях мы будем вызывать reversenumber (n/10, n % 10 + k*10) с обновленными значениями n и revnum соответственно.

| итерация | Значение п | Значение оборота | Возвращаемое значение |


| 0 | 54689 | 0 | возврат(54689,0) |


| 1 | 5468 | 9 | возврат(5468,9) |


| 2 | 546 | 98 | возврат(546,98) |


| 3 | 54 | 986 | возврат (54 986) |


| 4 | 5 | 9864 | возврат(5,9864) |


| 5 | 0 | 98654 | так как n==0, то мы просто вернем значение revnum = 98654 |


Использование функции


```нажмите


включить


int revnumber( int n){


int rem , rev_num =0;


для (; n> 0; n = n/10){


рем = n%10 ;


rev_num = rev_num*10 + rem;


вернуть rev_num;


интервал основной () {


целое число, rev_num = 0;


prinf("введите число, которое вы хотите поменять местами:");


scanf("%d",&num);


rev_num = revnumber (число);


printf ("обратное значение данного числа %d: %d", num , rev_num);


вернуть 0;


Выход


```нажмите


введите номер, который вы хотите отменить: 56897


обратная сторона данного числа 54689: 79865


Что делать, если в качестве входных данных задано отрицательное число?


Как мы знаем, компьютер обрабатывает только двоичные числа, в отличие от людей, которые могут интерпретировать несколько языков. Двоичное числовое представление отрицательных чисел отличается от положительных чисел.


Таким образом, если мы напрямую применим описанный выше алгоритм к отрицательному числу, он даст неверный ответ. Чтобы избежать такого случая, мы умножим указанное отрицательное число на -1, чтобы сделать его положительным числом, а затем применим алгоритм, чтобы сделать его обратным, и после этого мы снова умножим -1 на обратное число.


Приведенный код поможет лучше понять это.


```нажмите


включить


включить


интервал основной () {


int num, rev_num = 0 , rem ;


логический отрицательный = ложь;


prinf("введите число, которое вы хотите поменять местами:");


scanf("%d",&num);


если (число < 0){


число = -число;


отрицательный = истина;


// используем цикл while и уменьшаем num до num >= 0


в то время как (число! = 0) {


рем = число %10 ;


rev_num = (rev_num *10) + rem;


число = число/ 10 ; //обновление числа делением на 10


если (отрицательный) {


число = - число;


printf ("обратное значение данного числа %d: %d", num , rev_num);


вернуть 0;


Обработка случаев переполнения при реверсировании числа


Как мы знаем, целое число может обрабатывать до 32 бит. Может случиться так, что обратное число превысит или переполнит 32 бита. В таком случае каждый раз проверяйте, не превышает ли обратное число 32 бита.


Приведенный ниже код обеспечивает лучшее понимание.


```нажмите


включить


int revnumber( int n){


int rem , rev_num = 0, prev_num = 0;


в то время как (п! =0){


рем = n%10 ;


prev_num = (rev_num) *10 + rem;


if ((prev_num - rem )/10 != rev){


printf("ВНИМАНИЕ, ОБРАТНЫЙ НОМЕР ПЕРЕПОЛНЕН!!!");


вернуть 0;


иначе rev_num = предыдущий_num;


п = п/10;


вернуть rev_num;


интервал основной () {


целое число, rev_num = 0;


prinf("введите число, которое вы хотите поменять местами:");


scanf("%d",&num);


rev_num = revnumber (число);


если (rev_num!= 0){


printf ("обратное значение данного числа %d: %d", num , rev_num);


вернуть 0;


В этом коде мы проверили, не переполнен ли обратный номер. В случае переполнения rev_num будет содержать мусорное значение, которое не будет равно (prev_num - rem)/10.


Анализ алгоритма


Временная сложность


Цикл while или рекурсивная функция выполняет программу для количества цифр, присутствующих в числе. Ряд цифр в числе num имеет вычисление log (num) по основанию 10. Таким образом, временная сложность равна O (log10 (num)).


Космическая сложность


Мы не использовали дополнительное пространство. Таким образом, пространственная сложность равна O(1).


Заключение


В этой статье мы рассмотрели алгоритм обращения числа и различные методы, с помощью которых его можно реализовать в C-подобном цикле, рекурсивном.


Наряду с этим мы могли видеть некоторые угловые случаи, например, если заданный ввод отрицательный или обратное число превышает 32 бита.


Чтобы еще больше расширить свои знания об обращении числа и его использовании с красивыми схемами, вы можете взглянуть на эту кураторскую статью, опубликованную в [C Program to Reverse a Number] (https://www.scaler.com/topics). /c-program-to-reverse-a-number/) на темы Scaler.



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE