Как разделить число на цифры 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>

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

Author24 — интернет-сервис помощи студентам

Доброго всем. Задача из учебника Дейтела. Скажу сразу, изучаю Си самостоятельно(не учебное заведение). С задачей справился, но есть вопрос. В начале, введенное четырехзначное число нужно разбить на отдельные цифры используя деление и взятие по модулю. Я додумался до способа который привел в коде. Понимаю, что можно еще преобразовать введенное число в строку и тоже вывести цифры по отдельности. А есть ли еще какие нибудь способы разбить число на отдельные цифры кроме перечисленных мной? а то много задач встречается с таким вопросом.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
/*3_46. Шифрование четырехзначного числа*/ /* Заменить каждую цифру значением (суммы этой цифры и 7)*/ /* по модулю 10. Затем поменять местами 1-ю и 3-ю цифры,*/ /* затем поменять 2-ю и 4-ю цифры*/ #include main() { int integer; /*Введенное число*/ int A1; /*Переменная первой цифры*/ int A2; /*второй*/ int A3; /*третьей*/ int A4; /*четвертой*/ int temporary; /*Переменная для временного хранения*/ printf("Enter an integer(4 digits): "); scanf("%d", &integer); /*-------------------------------------------------------*/ /*Разбивание числа на отдельные цифры*/ /*Тысячи*/ A1 = (integer - (integer % 1000)) / 1000; /*Сотни*/ A2 = ((integer - (integer % 100)) - (integer - (integer % 1000))) / 100; /*Дестки*/ A3 = ((integer - (integer % 10)) - (integer - (integer % 100))) / 10; /*Единицы*/ A4 = integer % 10; /*----------------------------------------------------------*/ /*Заменяем каждую цифру на значение (сумма цифры и 7) по модулю 10*/ A1 = (A1 + 7) % 10; A2 = (A2 + 7) % 10; A3 = (A3 + 7) % 10; A4 = (A4 + 7) % 10; /*----------------------------------------------------------*/ /*Меняем местами первую и третью цифры*/ temporary = A3; A3 = A1; A1 = temporary; /*-----------------------------------------------------------*/ /*Меняем местами вторую и четвертую цифры*/ temporary = A4; A4 = A2; A2 = temporary; /*------------------------------------------------------------*/ /*Выводим зашифрованное число*/ printf("\n%d%d%d%d", A1, A2, A3, A4); return 0; }

Заранее благодарю.

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

Ну можно немножко посидеть и такое запилить, но задача была четкая, 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 к карме ))

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

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

Существует число 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.

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

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