Как развернуть число в c
Перейти к содержимому

Как развернуть число в c

  • автор:

Программа на языке C для разворота числа с использованием функции

В данной статье мы рассмотрим, как написать программу на языке C для разворота (обращения) числа с использованием функции. Разворот числа означает изменение порядка его цифр в обратном направлении.

Описание алгоритма

  1. Прочитать исходное число с клавиатуры.
  2. Инициализировать переменную для хранения развернутого числа.
  3. Используя цикл, получить последнюю цифру исходного числа и добавить ее к развернутому числу.
  4. Убрать последнюю цифру из исходного числа.
  5. Повторять шаги 3 и 4, пока исходное число не станет равным нулю.
  6. Вывести развернутое число на экран.

Примеры кода

Приведем несколько примеров кода на языке C, реализующих алгоритм разворота числа с использованием функции.

Пример 1:

В данном примере используется функция reverseNumber, которая принимает исходное число в качестве аргумента и возвращает развернутое число.

#include int reverseNumber(int num) < int revNum = 0; while (num != 0) < int remainder = num % 10; revNum = revNum * 10 + remainder; num /= 10; >return revNum; > int main()
Вывод:

Введите число: 12345
Развернутое число: 54321

Пример 2:

В этом примере функция reverseNumber изменена таким образом, чтобы развернутое число передавалось по ссылке (int*), а не возвращалось.

#include void reverseNumber(int num, int* revNum) < *revNum = 0; while (num != 0) < int remainder = num % 10; *revNum = *revNum * 10 + remainder; num /= 10; >> int main()
Вывод:

Введите число: 9876
Развернутое число: 6789

Пример 3:

Этот пример демонстрирует использование рекурсии для разворота числа. Функция reverseNumber вызывает саму себя, пока исходное число не станет равным нулю.

#include int reverseNumber(int num) < if (num == 0) < return 0; >int lastDigit = num % 10; int remainingDigits = num / 10; return lastDigit * pow(10, ceil(log10(remainingDigits) + 1)) + reverseNumber(remainingDigits); > int main()
Вывод:

Введите число: 987654321
Развернутое число: 123456789

Заключение

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

как развернуть число?

В продолжение коммента от avp — просто напечатайте число в строку. Например так string str = to_string(chislo); И потом выводите символьный массив по 1 символу, пропуская единицы.

6 окт 2022 в 5:46

@avp почему в int-e может быть максимум 10 цифр? Это в случае 4байтового int-a, если я нигде не ошибся, то в языках с и с++ размер тип данных зависит от «железа»

6 окт 2022 в 8:08

@SpaceResearcher, теоретически да, но реально во всех современных реализациях sizeof(int) = 4 . Ну, если опасаетесь, что он может быть 8-ми байтным, то используйте массив из 20 элементов ( #define LLONG_MAX 9223372036854775807LL из /usr/include/limits.h)

6 окт 2022 в 17:49

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Короткий вариант с использованием символьного массива.

int main()

Отслеживать
ответ дан 6 окт 2022 в 5:52
4,568 1 1 золотой знак 6 6 серебряных знаков 19 19 бронзовых знаков

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

#include #include using namespace std; int main() < int divider = 1; int number = 2136; int digit=0; while(number / divider >= 10) < divider *= 10; >while(divider > 0) < digit = (number - number % divider) / divider; number -= digit * divider; divider /= 10; if (digit != 1) cout > 

Этот код излишен тем что содержит целых 2 цикла while , но нам нужно как-то определить длину числа, чтобы найти первый делитель 1000, если бы мы вводили строку это сделать было бы проще (по длине строки), но тогда ее мы и могли бы обработать даже без операции деления

От первого цикла можно избавится использовав математические функции pov и log но для этого нужно будет подключить импорт и использовать -lm флаг при компиляции:

#include #include #include using namespace std; int main() < int number = 2136; int divider = pow(10, (number == 0 ? 0: int(log10 (number)))); int digit; while(divider >0) < digit = number / divider; number -= digit * divider; divider /= 10; if (digit != 1) cout > 

В выражении pow(10, (number == 0 ? 0: int(log10 (number)))); мы смотрим не является ли число нулем, после чего берем десятичный логарифм числа иначе, возвращаем нулевую степень что в итоге сделает divider равным 1 для отображения 0 , но это можно было бы сделать и через условие.

Отслеживать
ответ дан 6 окт 2022 в 0:24
Daniil Loban Daniil Loban
11.3k 2 2 золотых знака 9 9 серебряных знаков 18 18 бронзовых знаков

Вот способ печати в правильном порядке без массива

 int n = 100500; // we want to print this variable int u = 0; int k = 0; // number of digits in `n` do < u = u * 10 + n % 10; k++; >while (n /= 10); // now we have in `u` our number in "reverse order" // using the same algorithm print the value of `n` in "normal order" for (int i = 0; i < k; i++) < printf("%d", u % 10); u /= 10; >puts(""); 

Если посмотреть на этот фрагмент внимательно, то в нем есть два существенных недостатка. 1) Он не работает с отрицательными числами; 2) в нем излишне много дорогих операций (деление и умножение).

Если упаковывать получаемые десятичные цифры в вспомогательную переменную по 4 бита на цифру, то количество делений можно оптимизировать, а от умножений вовсе избавиться. Единственный недостаток такого подхода — некоторое логическое усложнение, т.к. возможен вариант, когда 2 цифры в эту переменную естественным образом не помещаются.

Впрочем, я думаю, сам код говорит больше, чем слова, поясняющие его.

 n = -2147483648; unsigned v = 0, nn = n; if (n < 0) < putchar('-'); nn = -n; >// save lower digits in `v` (4 bits for one digit, maximum 8 digits) for (k = nn ? 0 : 1; k < 8 && nn; k++) < v = (v if (k > 7) < if (nn >9) putchar((nn / 10) + '0'); // print highest digit putchar((nn % 10) + '0'); // print other high digit > for (int i = 0; i < k; i++) < putchar((v & 0xf) + '0'); // print lower digits in correct order v >>= 4; // pop digit from our "stack" > putchar('\n'); 

Умозрительно, конечно, но такой код должен быть (на достойном проце -)) в разы эффективней предыдущего.

Кстати, обратите внимание на этот пролог

 unsigned v = 0, nn = n; if (n

Он обеспечивает правильную печать отрицательных чисел, преобразуя их в беззнаковые.

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

Для наглядности: на вход программе даётся число, к примеру 1234. Нужно сделать так, чтобы на выходе вывелось число 4321. Как это можно реализовать в C++? Нужно, чтобы на выходе перевёрнутая переменная была типа int. Буду признателен всем ответам.

Отслеживать
задан 4 окт 2019 в 13:21
173 1 1 золотой знак 2 2 серебряных знака 16 16 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

int n = 4321; int m = 0; while(n) < m = m*10+n%10; n /= 10; >cout  

Отслеживать
ответ дан 4 окт 2019 в 13:24
222k 15 15 золотых знаков 120 120 серебряных знаков 234 234 бронзовых знака

    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.4.30.8420

Арифметические действия в языке Си

Программы работают с данными. Зачастую данные представляют собой числа. В этом уроке, как вы наверное догадались, мы будем заниматься изучением того, как и что в языке Си можно делать с числами. Начнём с арифметики.

Компилятор языка Си понимает все основные арифметические операции, которые вам известны со школы. Плюс есть несколько дополнительных.

Основные арифметические операторы языка Си.

+ оператор сложения
- оператор вычитания
* оператор умножения
% оператор взятия остатка от деления
/ оператор деления

Следующая программа иллюстрирует использование первых четырёх из них. Кстати, обратите внимание на то, как с помощью функции printf вывести на экран символ % .

#include int main(void)

Результат работы этой программы представлен на следующем рисунке.

Рис.5 Использование арифметических действий в Си.

Всё чётко и понятно. Никаких неожиданностей. А теперь попробуем получить частное двух чисел. Т.к. результат должен получиться 3.5, то res объявим как float .

#include int main(void)< int a=7, b=2; float res; res = a/b; printf("%d / %d = %f\n",a,b,res); return 0; >

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

При делении значение целого типа на значение целого типа результат тоже получается целого типа.

Так уж устроен язык Си. Поэкспериментируйте, попробуйте любые другие целые числа.

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

Пример: Как получить результат целочисленного деления

7/2 = 3.5 → 3
11/3 = 3.66 → 3
2/5 = 0.4 → 0

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

Посмотрим на нашем примере:

#include int main(void)< int a=7, b=2; float res; res = (float)a/b; printf("%d / %d = %f\n",a,b,res); return 0; >

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

Явное преобразование (приведение) типа.

Если какое-то значение нужно привести к другому типу, нужно перед этим значением в скобках написать название требуемого типа.

Листинг 4. Примеры явного преобразования типа

int a=7, b; float g= 9.81,v; b = (int) g; //приводим значение 9.81 к типу int, получим 9 v= (float)a; // приводим значение 7 к типу float, получим 7.0

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

Обратите внимание, что, когда мы преобразовываем целое значение в вещественное, ничего особенного не происходит, т.к. вещественные числа включают в себя целые.

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

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

Деление, целочисленное деление и остаток от деления. Отличия

Рис.2 Деление, целочисленное деление и остаток от деления.

Сохрани в закладки или поддержи проект.

Практика

Решите предложенные задачи:

Для удобства работы сразу переходите в полноэкранный режим

Исследовательские задачи для хакеров

  1. Подумайте и приведите примеры, когда обычное деление не имеет смысла. Например, деление трёх лицензионных ключей от программы между двумя людьми. Зачем кому-то нужна половина лицензионного ключа? (если, конечно, он не занимается reverse engineering).
  2. Что происходит при делении на ноль в вашей системе?

Дополнительные материалы

  1. Дополнительные задачи с автоматической проверкой решения из курса " Введение в программирование (C++) " от компании Яндекс. не беспокойтесь, что курс по С++. Удаляйте заготовку из поля для решения и спокойно вставляйте код на Си. Проверяющая система его будет нормально воспринимать.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *