Разбиение числа на языке СИ
Существует ли функция разбиения числа на составляющие цифры?
Существует число 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.
Разбить число на цифры
Либо конвертировать в строку и разбирать по символам (лучше для 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++] Разбиение числа на разряды и порязрядный вывод через пробел
P.S. Решение на С++. Используя инструкцию if. И функции printf(), scanf().
Последнее редактирование: 14 Авг 2010
iskander-k
Ассоциация VN/VIP
VIP
Сообщения 3,607 Реакции 2,139
Хитрец. А Самому решить ?
Alex1983
Разработчик
Сообщения 1,145 Реакции 243
Не могу сообразить.
AlexTNT
Участник
Сообщения 69 Реакции 19
выводит эти цифры на печать
На дисплей?
P.S. Решение на С++. Используя инструкцию if. И функции printf(), scanf().
printf(), scanf() — это уже С
Alex1983
Разработчик
Сообщения 1,145 Реакции 243
На дисплей?
printf(), scanf() — это уже С
Это взято из учебника-задачника по С/С++.
AlexTNT
Участник
Сообщения 69 Реакции 19
Вот код, но это уже С, if не придумал куда вставить.
#include #include int main() < char c; scanf("%c",&c); for (int i=0;i<5;i++) < printf("%c ",c); scanf("%c",&c); >if(c!='\n') printf("\nKol-vo bolishe 5"); printf("\n"); system("PAUSE"); return 0; >
Добавлено через 12 часов 6 минут 18 секунд
if не придумал куда вставить.
Прошу прощения, if вставил ещё вчера, а само сообщение не отредактировал.
Drongo
Ассоциация VN/VIP
VIP
Сообщения 7,345 Реакции 4,793
AlexTNT, А вы батенька, хитрец. :biggrin:
На пишите программу которая счывает число из пяти цифр
Число нужно, а не строка.
Покопавшись в своих решениях, нашёл, эту задачу из книги Дейтелов, и как я её тогда решил, прочитав только первую и вторую главу.
// Задачи главы 1. Задача 1.36 // Пробел между цифрами #include using namespace std; int main() < int num1, tic, num2, sot, num3, dec, num4, one; cout>num1; while(num1 != -1)< tic = num1 / 1000; num2 = num1 % 1000; sot = num2 / 100; num3 = num2 % 100; dec = num3 / 10; num4 = num3 % 10; one = num4 / 1; cout>num1; > return 0; > //---------------------------------------------------------------------------
Программа просит ввести четырёхзначное число и разбивает на числа через пробел, если вводить меньше четырёх или больше четырёх разрядов, выводимое решение будет неверно. Но это было решено уже позже, понадобились знания создания динамических массивов и вроде бы всё. Если интересно, поищу и приведу пример уже в понедельник.
P.S. Вместо printf\scanf лучше используй cout\cin проще на уровень. А результат тот же.
Alex1983
Разработчик
Сообщения 1,145 Реакции 243
printf(), scanf() — это уже С
Я нашел ошибку, вместо С++ я скачал просто С.
Программа просит ввести четырёхзначное число и разбивает на числа через пробел, если вводить меньше четырёх или больше четырёх разрядов, выводимое решение будет неверно. Но это было решено уже позже, понадобились знания создания динамических массивов и вроде бы всё. Если интересно, поищу и приведу пример уже в понедельник.
Конечно интересно, буду ждать.
P.S. Вместо printf\scanf лучше используй cout\cin проще на уровень. А результат тот же.
Понял. Спасибо за подсказку.
Drongo
Ассоциация VN/VIP
VIP
Сообщения 7,345 Реакции 4,793
Конечно интересно, буду ждать.
В принципе нашёл, но видимо запутался, без создания динамических массивов, для её написания, вполне достаточно двух глав 1 и 2 по книге Дейтелов. Что не ясно, спрашивай.
// Написать прогу, которая по заданному натуральному числу // определяет количество цифр в нем и выводит их по одному через пробел. #include using std::cout; using std::cin; using std::endl; // Функция расчитывающая количество чисел во введённом числе. // Пока число делится на 10 // увеличиваем счётчик считающий кол-во разрядов в числе int Rasriad(int enterNumber) < int n = enterNumber, x = 0; while(n != 0)< n /= 10; x++; >return x; > int main() < int enterNumber, // сохраняем введённое число lenght = 0, // сохраняем "длину" числа, кол-во разрядов: 1234567 = 7 чисел indexRas, // последний запоминаемый разряд числа decimal = 1, // делитель, "отрывающий" разряды числа, после каждого прохода, умножается на 10 z; cout>enterNumber; // считываем число в переменную // определяет количество цифр в нем. lenght = Rasriad(enterNumber); // Вычисляем максимальное число, которым мы начнём "отрывать" разряды у введённого числа for(int j = 1; j < lenght; j++) decimal *= 10; coutcin>>z; return 0; > //---------------------------------------------------------------------------
Как разделить число на цифры 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>