Как перевернуть число в 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.
Оригинал