Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как разобрать число на цифры ? 
:(
    Опции темы
Frog
Дата 16.12.2006, 05:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 11.3.2006
Где: The swamp

Репутация: нет
Всего: нет



Здравствуйте господа! мне необходимо разобрать число на массив из состовляющих его цифр. 

К примеру: 

из
int а = 5432;
должен получиться массив
int ма[] = {5,4,3,2};

В джаве я делал так - преобразовывал int 'а' в строку , строку парсил, результатами набивал массив. Но во первых это возможно, не лучший способ даже для джавы , а во вторых в С я новичек , и как мне кажеться, тот subset языка который я сейчас изучаю (win32 для КПК) вообще "не понимает" строк и операций с ними... Посоветуйте что можно сделать - пожалуйста.

PM MAIL WWW   Вверх
witex
Дата 16.12.2006, 06:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 16.10.2006
Где: Эстония

Репутация: 0
Всего: 4



Вот поделился, что сам делал по учёбе.. не знаю уж и когда.
Код

#include <iostream.h>
#include <stdio.h>
#include <conio.h>
void main()
{
    int a,b,count,sum;
cout << " Vvedite naturaljnoe 4islo ";
cin >> a;
b=a;
count=0;
sum=0;
while(a>0)
{
    count++;
sum = sum+(a%10);
a/=10;
}
int *ch=new int[count-1];
a=count;
while(b>0)
{
    
ch[a-1] = b%10;
b/=10;
a--;
}
cout << "Koli4estvo cifr " << count <<endl;
cout << " Summa 4isel ravna " << sum <<endl;
for(a=0;a<count;a++)
cout << ch[a] << endl;
getch();
}

--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
MAKCim
Дата 16.12.2006, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Код

void convert(int numb, string& str) {
    if (numb / 10 > 0) convert(numb / 10, str);
    str += static_cast<char>((numb % 10) + 48);
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Anikmar
Дата 16.12.2006, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(MAKCim @ 16.12.2006,  11:04)
Код

void convert(int numb, string& str) {
    if (numb / 10 > 0) convert(numb / 10, str);
    str += static_cast<char>((numb % 10) + 48);
}

Я так понял, что нужно избегать строк.

Пример writex разумный, но:
Динамическое определение массива мне видится через чур сильным наворотом - сэкономленные несколько байт съедаются лишним кодом.
Не проще ли массив задать статически - в данном случае не вижу особой проблемы.

Если использовать динамический - то нужна отдельная переменная с его длиной - лучше тогда создать стрктурку, наверное. Тогда она будет держать и само исходное число и массив его циферок и методы преобразования...
PM MAIL ICQ   Вверх
anwe
Дата 16.12.2006, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: нет
Всего: 23



Так это простой алгоритм. Допустим для десятичного числа оно разбивается на тысячи, сотни, десятки и единицы. Вот и дели на них (без перевода строки): 1573=1*1000+5*100+7*10+3.
Целое от деление - будет целым, то есть твоей цифрой, а остаток делишь на 10 в степени на 1 меньше. И так дальше.
PM MAIL   Вверх
GIK
Дата 16.12.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 1
Всего: 14



Цитата

while(a>0)
{
    count++;
sum = sum+(a%10);
a/=10;
}
int *ch=new int[count-1];
a=count;
while(b>0)
{
    
ch[a-1] = b%10;
b/=10;
a--;
}

А я вот чето вообще не вкурю этот алгоритм smile 
В первом цикле не понятно почему собирается сумма остатков от деления. Потом создается массив длинной меньше на один чем кол-во итераций. Во втором цикле, с самого начала,обращаются зачем то вообще на индекс превышающий длину массива??? И походу переменная а  ни когда не дойдет до <0?

Цитата

for(a=0;a<count;a++)
cout << ch[a] << endl;
getch();
}
и как после этого получается нужный результат?


Блин, вообще не пойму smile 



--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Daevaorn
Дата 16.12.2006, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Frog @  16.12.2006,  06:19 Найти цитируемый пост)
тот subset языка который я сейчас изучаю (win32 для КПК) вообще "не понимает" строк и операций с ними... 

Что за subset, интересно?
PM MAIL WWW   Вверх
Anikmar
Дата 16.12.2006, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата

А я вот чето вообще не вкурю этот алгоритм  
В первом цикле не понятно почему собирается сумма остатков от деления. Потом создается массив длинной меньше на один чем кол-во итераций. Во втором цикле, с самого начала,обращаются зачем то вообще на индекс превышающий длину массива??? И походу переменная а  ни когда не дойдет до <0?


Мне показалось, что sum это рудимент от какого-то другого алгоритма.
Первый цикл считает количество циферок, чтобы узнать размер массива под них.
PM MAIL ICQ   Вверх
GIK
Дата 16.12.2006, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 1
Всего: 14



Все, догнал  smile 


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
witex
Дата 16.12.2006, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 16.10.2006
Где: Эстония

Репутация: 0
Всего: 4



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

GIK, "а" и не будет меньше 0, чтобы оборвать цикл достаточно чтобы "а" был равен 0.
Anikmar, знаю что особого смысла динамический массив делать! тогда и одного цикла хватит! ПРото размер, нормальный задать и всё!
Главное что работает! и что бы Frog понял!

--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
MAKCim
Дата 16.12.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Я так понял, что нужно избегать строк.

Код

void convert(int numb, char** str) {
    if (numb / 10 > 0) convert(numb / 10, str);
    **str = (char)((numb % 10) + 48);
    ++*str;
}


Это сообщение отредактировал(а) MAKCim - 16.12.2006, 16:43


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
zabivator
Дата 16.12.2006, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 7.6.2006
Где: нск

Репутация: 1
Всего: 2



Код

#include <vector>
#include <iostream>

void convert( int number, std::vector<int>& result )
{
   while( number != 0 )
   {
       int current_number = number % 10;
       result.push_front(  current_number );
       number -= current_number;
       number /= 10;
   }
}

int main( argc, argv*[] )
{
   vector<int> result;
   convert( 12312, result );
   unsigned s = result.size();
   for ( i = 0; i < s; ++i )
      std::cout<<s<<std::endl;
   return 0;
}

--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
witex
Дата 16.12.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 16.10.2006
Где: Эстония

Репутация: 0
Всего: 4



zabivator, ты чё издеваешься? зачем тут вектор? это же чистое извращение! Он дольще будет работать чем мои ва цикла, в 2 раза! Не надо так издеваться!
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
FelikZ
Дата 16.12.2006, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый Маразматик
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 1.12.2006
Где: Vault 13

Репутация: нет
Всего: 5



Да, пожалуй вектор тут точно ненадо юзать!
Вариант witex'а самый гуманный smile 


--------------------
user posted image
PM WWW ICQ Skype   Вверх
witex
Дата 16.12.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 16.10.2006
Где: Эстония

Репутация: 0
Всего: 4



Вопрос решён. Хотя коментов, самого автора не видели.
Но всё же,хватит пустые димагогии разводить! Закрывайте тему.
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0833 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.