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

Как разложить число на цифры c

  • автор:

Как разложить число на цифры c

Здравствуйте, TheAteist, Вы писали:

TA>В конечом итоге iDigits должен содержать , но там вместо этого
TA>Почему и как это исправить?

А как вы это выяснили, покажите пожалуйста =)

Re: Разобрать число на цифры

От: Анатолий Широков
Дата: 15.11.08 00:17
Оценка:

Здравствуйте, TheAteist, Вы писали:

Какой-то мудреный алгоритм вы использовали. Взгляните:

int d = 12345; char buffer[16] = ; char* head = buffer; while( d ) < *head++ = "0123456789"[d%10]; d /= 10; >

Вам останется лишь реверсировать полученный результат.

Re[2]: Разобрать число на цифры

От: TheAteist
Дата: 15.11.08 01:17
Оценка:

Здравствуйте, Dr.Offset, Вы писали:

DO>А как вы это выяснили, покажите пожалуйста =)

После деление на 10

(fNum / 10 - iNum / 10)

получается уже не 1234.500000, а 1234.50000001
потом 123.40000079.
и при каждом деление на 10 точность меняется и получается уже 1.1999999999 вместо 1.20000000.

Re[2]: Разобрать число на цифры

От: Roman Odaisky
Дата: 15.11.08 12:16
Оценка:

Здравствуйте, Анатолий Широков, Вы писали:

Вместо
АШ>»0123456789″[d%10];
лучше бы ‘0’ + d % 10. (Хотя стандарт этого и не гарантирует, в природе не встречаются кодировки, в которых ‘9’ ≠ ‘0’ + 9.)

А еще так можно: (d % 10)[«0123456789»]

До последнего не верил в пирамиду Лебедева.
Re: Пояснение

От: TheAteist
Дата: 15.11.08 12:26
Оценка:

Здравствуйте, TheAteist, Вы писали:

То что я пытался сделать это разделить пятизначное число на цифры следующим образом.
Например число 12345:

float fNum = 12345; int iNum; iNum = fNum; //fNum = iNum = 12345 //Первый цыкл (fNum / 10 - iNum / 10) * 10 // => ((float)12345/10 - (int)12345/10) * 10 = 0.500000000000000000 * 10 = 5.000000000000000, сохраняю эту цифру fNum = (fNum / 10) - ((fNum / 10 - iNum / 10)) // => (float)12345/10 - ((float)12345/10 - (int)12345/10) = 1234.50000000000000-(1234.50000000000000 - 1234)= 1234.50000000000000 - 0.500000000000000 = 1234.0000000000000=> fNum = 1234.0000000000000 iNum = fNum; // iNum = 1234 //Второй цыкл (fNum / 10 - iNum / 10) * 10 // => ((float)1234/10 - (int)1234/10) * 10 = 0.40000000000000568 * 10 = 4.000000000000568, сохраняю эту цифру fNum = (fNum / 10) - ((fNum / 10 - iNum / 10)) // => (float)1234/10 - ((float)1234/10 - (int)1234/10) = 123.40000000000001-(123.40000000000001 - 123)=123.40000000000001 - 0.4000000000000568=> fNum = 123.00000000000000 iNum = fNum; // iNum = 123 //Третий цыкл (fNum / 10 - iNum / 10) * 10 // => ((float)123/10 - (int)123/10) * 10 = 0.3000000000000071 * 10 = 3.0000000000000718, сохраняю эту цифру fNum = (fNum / 10) - ((fNum / 10 - iNum / 10)) // => (float)123/10 - ((float)123/10 - (int)123/10) = 12.30000000000001-(12.30000000000001 - 12)=12.30000000000001 - 0.300000000000071=> fNum = 12.00000000000000 iNum = fNum; // iNum = 12 //Четвертый цыкл (fNum / 10 - iNum / 10) * 10 // => ((float)12/10 - (int)12/10) * 10 = 0.1999999999999996 * 10 = 1.999999999999996, сохраняю эту цифру Как уже видно в четвертом цыкле уже получается не 2.00000000000000, а 1.99999999999999999 и тогда созраняается не 2, а 1. И после всех цыклов получается iDigits=, a не

Надеюсь, что я себя правильно объяснил.
Мне нужно таким способом это сделать. Где мне что-то добавить или исправить?

Re: Разобрать число на цифры

От: Nikita123
Дата: 17.11.08 11:34
Оценка:

Здравствуйте, TheAteist, Вы писали:

TA>В конечом итоге iDigits должен содержать , но там вместо этого
TA>Почему и как это исправить?
TA>

TA> float fNum=12345; TA> > TA>

Разбиение числа на языке СИ

Существует ли функция разбиения числа на составляющие цифры?

Существует число 1736
Нужно его разбить на состовляющие цифры 1, 7, 3, 6 и занести в массив ( можно даже в символьном виде )
С помощью какой функции можно это сделать?

Лучший ответ
for ( i = 4 ; i ; i — )
<
num=x % 10; // это будут цифры
x=x/10;
>
Остальные ответы
int x=1736;
do
<
cout x=x/10;
>
while(x!=0);
#include
#include

main()
<
int A[100], x, k, j = 0;
scanf(«%d», &x);
while (x > 0) <
A[j++] = x % 10;
x/= 10;
>
for (k = j-1; k >= 0; k—)
printf(«%d «, A[k]);
getch();
>

#include
#include
#define N 4
int main() <
unsigned x = 1736;
unsigned a[N];
unsigned next = N — 1;
while (x) <
a[next—] = x % 10;
x /= 10;
>
for (next = 0; next < N; next++) printf("%d ", a[next]);
_getch();
return 0;
>

Похожие вопросы
Ваш браузер устарел

Мы постоянно добавляем новый функционал в основной интерфейс проекта. К сожалению, старые браузеры не в состоянии качественно работать с современными программными продуктами. Для корректной работы используйте последние версии браузеров Chrome, Mozilla Firefox, Opera, Microsoft Edge или установите браузер Atom.

Выделение в цикле цифр в числе от младших разрядов к старшим

Выделение в цикле цифр в числе от младших разрядов к старшим

Сегодня мы узнаем с вами, как отделить каждую цифру от числа начиная от младшего разряда, заканчивая старшим. Это нам частенько пригодится в дальнейшем.

Разделение числа на цифры

Идея алгоритма:
Для каждого числа необходимо найти его разряд.

  1. 1 => единица;
  2. 42 => 4 десятка и 2 единицы;
  3. 829 => 8 сотен, 2 десятка, 9 единиц.

Поиск разрядов числа

Нам дано число: 123456789

Последнюю цифру мы легко найдем, нам достаточно наше число разделить 10 с остатком. А что делать с предпоследней цифрой? Тут как минимум есть два варианта:

  1. /10 – откинули последнюю цифру, а затем снова %10;
  2. %10 и его степень. Способ довольно неудобный. Поэтому мы не будем им пользоваться.

Первый вариант кажется достаточно удобным. Мы будем получать нужную нам цифру в ходе каждой итерации цикла.

  1. 123456789 % 10 = 9;
  2. 123456789 / 10 = 12345678;
  3. Переходим к следующей итерации
  4. 12345678 % 10 = 8;
  5. 12345678 / 10 = 1234567;

И так далее пока не переберем все число.

Алгоритм разделения числа на цифры

Алгоритм разделения числа на цифры

  1. Ввести число a;
  2. Запустить цикл;
  3. Найти цифру при помощи a % 10;
  4. Вывести цифру (или использовать ее в задаче);
  5. Уменьшить а в 10 раз.

Этот цикл будет работать до тех пор, пока n не превратится в 0.

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

Использование алгоритма

Мы можем применять данный алгоритм в этих случаях

  1. Анализ зависимостей в цифрах числа;
  2. Определение присутствия цифры;
  3. Подсчёт цифр;
  4. Подсчёт количества цифр;
  5. Замена цифр в числе;
  6. Анализ чисел в других системах счисления;
  7. Анализ бинарных данных.

Решение задач

Разбор задачи Счастливый билет

Задача счастливый билет

Например, мы хотим написать программу, которая проанализирует билет, который нам дали в автобусе, является он счастливым или нет? Если вы не помните или не знали, как это делается, напомню. Билет считается счастливым, когда сумма первых трех чисел равняется сумме трех последних.

Нам вводится номер билета и необходимо проверить, является ли он счастливым.
Давайте посчитаем. Посмотрите на номер нашего билета: 306 450.

  • Если мы просуммируем 3+0+6 == 4+5+0;
  • То получим в первой и второй сумме чисел одинаковое значение 9 == 9;
  • Это означает, что наш билет счастливый.

Все элементарно, но теперь встает вопрос, как же нам разбить наше число на отдельные цифры? А мы уже знаем, как это сделать.

Алгоритм решения
  1. Ввести число;
  2. Разделять его на цифры;
  3. Первые три числа добавлять в sum1;
  4. Последние три числа добавлять в sum2;
  5. Сравнить sum1 и sum2.

Решение задачи Счастливый билет

Разложи на цифры

Дано восьмизначное число, необходимо написать в строку каждую цифру данного числа через пробел, начиная с разряда единиц.
Формат входных данных
Дано целое число N (10 000 000 Tags

Разбить число на цифры

Ну можно немножко посидеть и такое запилить, но задача была четкая, 3хзначное число, разложить на 3 отдельных, задача выполнена, выдумывать что-то не собираюсь. Завтра может попробую.

Вот, на любое целое или дробное, отрицательное или неотрицательное число
// Разбиение числа на цифры

#include #include using std::cout; using std::cin; using std::endl; using std::ends; using std::string; bool check4(string x) // проверка на пропущенный ноль в начале дробного числа < if ((static_cast(x[0]) == 44) // если знак "," первый, ИЛИ || (static_cast(x[0]) == 46) // если знак "." первый, ИЛИ || ((static_cast(x[0]) == 43 || static_cast(x[0]) == 45) // если "+" ИЛИ "-" первый знак, И && (static_cast(x[1]) == 44) || (static_cast(x[1]) == 46))) // "." ИЛИ "," второй знак < return true; // если обнаружена точка-запятая без предшествующей цифры, то истина, что ноль пропущен. >else return false; > bool check3(string x) // проверка количества точек-запятых в дробном числе < unsigned int count = 0; for (int i = 0; x[i]; i++) < if (static_cast(x[i]) == 44 // знак "," || static_cast(x[i]) == 46) // знак "." < count++; >> if (count > 1) // если в числе больше одной точки-запятой, то ошибка return false; else return true; > bool check2(string x) // Проверка корректности остальных знаков < for (int i = 1; x[i]; i++) if (!(static_cast(x[i]) == 44 // знак "," || static_cast(x[i]) == 46 // знак "." || (static_cast(x[i]) >= 48 // цифры && static_cast(x[i]) return true; > bool check1(string x) // Проверка корректности первого знака < if ((static_cast(x[0]) >= 43 // знаки "+" "-" "." "," && static_cast(x[0]) <= 46) || (static_cast(x[0]) >= 48 // цифры && static_cast(x[0]) else return false; // если обнаружен знак - не цифра, не плюс-минус и не точка-запятая, то ошибка > void frag(string x) < cout << "Ваше число состоит из цифр: "; if(check4(x)) // проверка на пропущенный ноль перед дробью cout << "0" << ends; // если пропущен, печатаем ноль for (int i = 0; x[i]; i++) < if (static_cast(x[i]) >= 48 // печатаем только цифры && static_cast(x[i]) > > int main() < setlocale(LC_CTYPE, ".1251"); string x; while (true) < cout > 

Slonopotam, ты решал задачу, исходя из некорректно понятого условия. Изначально было написано: Помогите разбить 3 значное число на цифры. Число! Т.е. предполагается, что число существует уже в виде экземпляра числового типа (int, double и родственные типы), а не в виде строки символов.

(1) Не стоит хардкодить коды цифр и знаков. Например:

= 48 // цифры && static_cast(x[0])  

в другой кодовой таблице этим кодам могут соответствовать совсем другие символы. Более переносимый вариант:

= '0' && x[0]  

(Полностью переносимый вариант — это сравнение с каждой из цифр в отдельности, поскольку теоретически возможны кодовые таблицы, в которых цифры не идут единым блоком. Но я с такой экзотикой не встречался. А вот с буквами национальных алфавитов такое встречается очень часто.)

(2) С десятичным разделителем всё ещё веселее. Правильным было бы запрашивать у операционной системы какой символ используется для десятичного разделителя в локали, действующей в момент запуска программы.

(3) В программе не учитывается возможность ввода чисел в «научной» форме. Например, .758e2 — это 75.8 . Подробности см. в википедии.

Так что в плане универсальности твоего решения ты немного погорячился.

Но попытка засчитывается. +1 к карме ))

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

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