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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перевод числа в строку, Аптимизация кода 
:(
    Опции темы
GIK
Дата 27.12.2007, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Всем доброго времени суток.
Народ у кого есть идеи или алгоритмы перевода из инта в чары, только чтобы оптимальные и компактные. Где-то видел в одну строку почти, супер smile 
Как не понадобиться такая фигна, типа перевод из инта в чар или "обрезка" числа вечно приходится придумывать заново smile Охото уже раз и навсегда уловить смысл, чтобы это сделать надо видеть короткий код.

Вот писал перевод, причем писал относительно долго...

Код

   //перевод числа в строку
 int ITOG; char charrr[10]={0}; int result = 1;
    int ITOG=12367;
    while (value > 1)
    {value /= 10; ++result;} 


   int len=result; 
  
 for(int j=0; j<len; j++)
 { int b_ran=ITOG;
   int ran=0; 
  if(result!=1)
 {  
   for(int i=result-1; i!=0; i--)  //Возведение от начала в степень n-1 и до конца (предпоследнее число)  
   {
     ran+ = b_ran / pow (10, i); //собираем число
     };
   b_ran=0;
   b_ran = ITOG - ran;
   charrr[j]=(b_ran+48);
   result--;             //Уменьшается длина
   ITOG= ITOG - b_ran;   //Уменьшается число      
   ITOG= ITOG / pow(10, 1); //убираем ноль с конца числа
        /// последний будет при result=1, когда обработается два числа например 12, т.е. после ITOG= ITOG - b_ran; 
        //// ITOG будет = 10, и 10/10 даст 1 
   if(result==1)
     charrr[j]=(ITOG+48);
  }
}
Жду ваших вариантов в уменьшенном виде smile

Это сообщение отредактировал(а) GIK - 27.12.2007, 17:53


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


Эксперт
****


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

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



snprintf()
PM   Вверх
baldina
Дата 27.12.2007, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Зачем писал? itoa/ltoa не подходят? А в них, между прочим, pow не используется,  для отрицательных чисел минус выводится и поддерживаются разные системы счисления. Исходник CRT тоже не проблема посмотреть.

Добавлено через 1 минуту и 11 секунд
bsa, snprintf() штука удобная, но время на разбор формата тратится, а товарищу аптимально надо.
PM MAIL   Вверх
Fazil6
Дата 27.12.2007, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(GIK @  27.12.2007,  17:50 Найти цитируемый пост)
Жду ваших вариантов в уменьшенном виде


Код

#include <string>
#include <boost/lexical_cast.hpp>


template <class T> std::string ToString(const T &arg)
    {
        return boost::lexical_cast<std::string>(arg);
    }



PM MAIL   Вверх
bsa
Дата 27.12.2007, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(baldina @ 27.12.2007,  18:11)
Зачем писал? itoa/ltoa не подходят? А в них, между прочим, pow не используется,  для отрицательных чисел минус выводится и поддерживаются разные системы счисления. Исходник CRT тоже не проблема посмотреть.

Добавлено @ 18:12
bsa, snprintf() штука удобная, но время на разбор формата тратится, а товарищу аптимально надо.

itoa/ltoa - нестандартные. Т.е. нет никаких гарантий, что есть в выбранной версии libc
уверен, что snprintf работает быстрей, чем указанный алгоритм, и, в отличие от itoa, эта функция входит в стандартную библиотеку.
PM   Вверх
Earnest
Дата 27.12.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(GIK @  27.12.2007,  18:50 Найти цитируемый пост)
только чтобы оптимальные и компактные

не всегда, но часто противоречит друг другу.
А чем тебя itoa не устаривает? Оптимальный, но не компактный.
Впрочем, если использовать готовую функцию, одна строка и будет.



--------------------
...
PM   Вверх
bsa
Дата 27.12.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Fazil6, тогда уж можно так: 
Код
std::string numString = (std::stringstream() << 12345).c_str();

PM   Вверх
Earnest
Дата 27.12.2007, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(bsa @  27.12.2007,  19:15 Найти цитируемый пост)
itoa/ltoa - нестандартные. 

Разве? Это же стандартая функция C-библиотеки. А вот snprintf недавно появилась, где-то может и не быть... впрочем есть sprintf...



--------------------
...
PM   Вверх
baldina
Дата 27.12.2007, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



так не проще?
Код

char *p = charrr;
do {
    int digit = (unsigned)ITOG % 10;
    ITOG /= 10; 
    *p++ =  (char)(digit + '0');
} while (ITOG > 0);
// получили строку в обратном порядке. теперь надо перевернуть
// можно strrev, можно и врукопашную ;-)


Добавлено через 5 минут и 44 секунды
они действительно нестандартные, но стандартны де-факто, мне еще не приходилось видеть стандартную библиотеку без них (все когда-то происходит впервые?  smile). 
PM MAIL   Вверх
bsa
Дата 27.12.2007, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Earnest @ 27.12.2007,  18:20)
Цитата(bsa @  27.12.2007,  19:15 Найти цитируемый пост)
itoa/ltoa - нестандартные. 

Разве? Это же стандартая функция C-библиотеки. А вот snprintf недавно появилась, где-то может и не быть... впрочем есть sprintf...

Стандартная библиотека - это:
Код
       #include <stdlib.h>

       int atoi(const char *nptr);
       long atol(const char *nptr);
       long long atoll(const char *nptr);
       long long atoq(const char *nptr);
А itoa - это расширение: http://ru.wikipedia.org/wiki/Itoa

PM   Вверх
MAKCim
Дата 28.12.2007, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

static int __convert(unsigned int number, char ** array) {
    int division = number / 10;
    int error = 0;
    if (division > 0) 
        error = __convert(division, array);
    **array = number % 10 + '0';
    ++*array;
    return error;
}

static int convert(int number, char * array) {
    if (number < 0) {
        number = -number;
        *array++ = '-';
    }
    return __convert((unsigned int)number, &array);
}


Это сообщение отредактировал(а) MAKCim - 28.12.2007, 20:40


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

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


Опытный
**


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

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



Цитата(MAKCim @  28.12.2007,  10:28 Найти цитируемый пост)
if (division < 30 || division > 39) 

Имелось в виду
Код

if (division < 0x30 || division > 0x39)

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


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


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

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



Ln78, 
угу
исправлено


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

PM MAIL   Вверх
maxim1000
Дата 28.12.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(MAKCim @  28.12.2007,  10:28 Найти цитируемый пост)
if (division < 0x30 || division > 0x39)

а зачем она тут вообще?


--------------------
qqq
PM WWW   Вверх
Lazin
Дата 28.12.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(bsa @  27.12.2007,  18:17 Найти цитируемый пост)
Fazil6, тогда уж можно так: 

Код

std::string numString = (std::stringstream() << 12345).c_str();


это не будет работать
оператор << возвращает указатель на поток, у которого нет метода с_str()

Добавлено через 5 минут и 59 секунд
уж лучше так:
Код

std::string numString = dynamic_cast<strstream&>(std::strstream() << 12345).str();


Добавлено через 8 минут и 18 секунд
правда в моем варианте может исключение возникать, в случае если оператор << для класса определен не верно (не возвращает ссылку на ostream)

Это сообщение отредактировал(а) Lazin - 28.12.2007, 14:46
PM MAIL Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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