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

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

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

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

Либо конвертировать в строку и разбирать по символам (лучше для double) или постоянно брать остаток от деления на 10 (для int).

07 января 2007 года
4.8K / / 20.01.2000

Либо конвертировать в строку и разбирать по символам (лучше для double) или постоянно брать остаток от деления на 10 (для int).

Я уже как-то говорил, но повторюсь: руки за такое надо отрывать.

07 января 2007 года
2.6K / / 04.11.2006
07 января 2007 года
13 / / 06.01.2007
Я уже как-то говорил, но повторюсь: руки за такое надо отрывать.

Поясни, не будь голословным.

07 января 2007 года
4.8K / / 20.01.2000
Поясни, не будь голословным.

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

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

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

07 января 2007 года
2.6K / / 04.11.2006

Прошу прощения, я не вчитался и решил, что речь опять идет о длинных числах:). Для расчленения коротких чисел (которые есть среди стандартных типов), конечно, следует вычленять цифры, как сказал _const_. Единственное - я бы не использовал рекурсию. Здесь она имхо, не нужна.

07 января 2007 года
13 / / 06.01.2007
Green, да я стормозил. Причем жестко:).
11 января 2007 года
1.0K / / 08.01.2007

Коллеги, sorry,что постю в уже рассмотренную тему, но возник вопросик к Вам .
Взгляните на код рассматриваемой задачки . Не уверен , что она решена .
Рекурсии нет ( она не нужна ), ф - ии itoa( плохой стиль ) - тоже , но решается только для 9
( некоторых 10 )значных и меньших чисел 🙁 Пытался . Но тщетно . Может я не правильно
что - то сделал ? Где ошибка ? В связи с этой возникает другая более интересная задача о длинных
числах и операциях с ними .
Например , если сделать число float - как тогда быть с операцией " % "?
// VS2003 :

#include "stdafx.h"
#include "windows.h"

using std::cout;
using std::endl;
using std::cin;

inline char *rus( char *s ) // русский текст в консоли
<
char *t = new char[strlen(s) + 1];
CharToOem(s,t);
return t;
>
inline void func( unsigned a );// ф-ия разбиения
int _tmain( int argc, _TCHAR* argv[] )
unsigned value;
cout cin>>value;
func( value );
cout return 0;
>
inline void func( unsigned a )
unsigned b = a;int size = 0;

do // находим кол - во цифр в числе
b /= 10;
++size;
>while( b>0 );

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

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

Всем привет. Я интересуюсь как например разложить число 153 -> на 1 5 3 по отдельности программным спопособм. Тоесть получить цифры из которых состоит число.

Меня интересует только сам математический алгоритм, но можно и пример на C or Pascal.

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

Регистрация: 09.01.2008
Сообщений: 26,238

x mod 10 - вернёт последнюю цифру числа x
потом сдвигаем число, разделив его целочисленно на 10:
x := x div 10
повторяем, пока x > 0

Serge_Bliznykov
Посмотреть профиль
Найти ещё сообщения от Serge_Bliznykov

Форумчанин
Регистрация: 15.02.2008
Сообщений: 621

Два способа получения отдельной цифры:
1. (не помню на паскале это актуально или нет =\) Нуу в общем переведи в строку число и дергай по символу =))), т.е. это так как наш мозг работает =)))
2. для получения i-ой цифры (m) в числе n:
m=(n mod (10 ^(i))) div (10 ^ (i-1))

Помог? Ну так нажми на весы!

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

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