Компьютерный форум NoWa.cc Здесь может быть Ваша реклама
Правила Форума
редакция от 22.06.2020
Форум .::NoWa.cc::.
Вернуться   Компьютерный форум NoWa.cc > В помощь вебмастеру > Программирование > Visual C++ / С/C++

Уважаемые пользователи nowa.cc. Мы работаем для вас более 20 лет и сейчас вынуждены просить о финансовой помощи по оплате за сервер.
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже.
Webmoney Webmoney WMZ: Z021474945171 Webmoney WME: E159284508897 Webmoney WMUSDT: T206853643180
Кошелёк для вашей помощи YooMoney 4100117770549562
YooMoney Спасибо за поддержку!

Ответ
 
Опции темы Опции просмотра Language
Старый 02.12.2007, 00:00   #1
ViP
 
Аватар для pluton
 
Пол:Мужской
Регистрация: 23.02.2007
Сообщений: 1,027
Репутация: 560
По умолчанию Оптимизация алгоритма

привет всем!
есть алгоритм перевода из десятичной системы счисления в другую:
Код:
void convert(int num, int system, char* out)
{
    int curc = 0, n;
    char* str = new char[80];
    cout << pow(num, 1.0/system) << endl;
    while (num > 0)
    {
        str[curc++] = ((n = (num % system)) < 10) ? n + '0' : n + 'a' - 10;
        num /= system;
    }
    curc--;
    for (int i = 0; i <= curc; i++)
        out[i] = str[curc - i];
    out[++curc] = '\0';
    delete str;
}
при переводе остатки от деления сохраняются в строку, но в обратном порядке, поэтому их нужно инвертировать. для этого выделяется дополнительная строка str.
кто-нибудь подскажет как оптимизировать алгоритм по времени выполнения?
собственно, я думаю надо убрать строку str, а остатки записывать сразу в out в обратном порядке. тут возникает проблема определения длины строки с числом в новой системе счисления.
__________________
THE TRUTH IS OUT THERE
pluton вне форума
 
Ответить с цитированием Вверх
Здесь может быть Ваша реклама
Здесь может быть Ваша реклама


Реклама: звук свободы рецензиябукет из конфет купить3D печать нейлономtu-d12 pro pt1000кресло лежак


Старый 02.12.2007, 06:43   #2
voidarg
Неактивный пользователь
 
Регистрация: 22.08.2007
Сообщений: 9
Репутация: 1
По умолчанию Ответ: Оптимизация алгоритма

Если это не домашнее задание, то почему бы не воспользоваться имеющимися функциями типа strtod и strtol?
voidarg вне форума
 
Ответить с цитированием Вверх
Старый 02.12.2007, 17:30   #3
pluton
ViP
 
Аватар для pluton
 
Пол:Мужской
Регистрация: 23.02.2007
Сообщений: 1,027
Репутация: 560
По умолчанию Ответ: Оптимизация алгоритма

Цитата:
Сообщение от voidarg Посмотреть сообщение
почему бы не воспользоваться имеющимися функциями типа strtod и strtol?

Цитата:
Function: long int strtol (const char *restrict string, char **restrict tailptr, int base)
The strtol (“string-to-long”) function converts the initial part of string to a signed integer, which is returned as a value of type long int.

как я понял, она преобразует число в виде строки в число. не очень понятно зачем тут base. как её использовать?
мне надо число в виде int в десятичке конвертить в строку в системе system. желательно своей функцией.

Цитата:
Function: double strtod (const char *restrict string, char **restrict tailptr)
The strtod (“string-to-double”) function converts the initial part of string to a floating-point number, which is returned as a value of type double.

тут вообще нету base.
__________________
THE TRUTH IS OUT THERE
pluton вне форума
 
Ответить с цитированием Вверх
Старый 04.12.2007, 09:28   #4
voidarg
Неактивный пользователь
 
Регистрация: 22.08.2007
Сообщений: 9
Репутация: 1
По умолчанию Ответ: Оптимизация алгоритма

Это я, извините, прогнал - поздно было Имелись ввиду функции itoa, ltoa и ultoa, конечно же.

Добавлено через 1 час 24 минуты
Еще один вариант:

stringstream ss;
ss << hex << num;
return ss.str();

stringstream ss;
ss << oct << num;
return ss.str();

Опять же вопрос в том в какие системы Вы пытаетесь переводить из десятичной. Если в восьмиричную или шестнадцатиричную, то есть стандартные функции в си и в си++. Если в "любую" то для 12-тиричной Вам придется использовать римские цифры, а для 15-тиричной я вообще не в курсе как и что обозначать.

Последний раз редактировалось voidarg; 04.12.2007 в 10:53.. Причина: Добавлено сообщение
voidarg вне форума
 
Ответить с цитированием Вверх
Старый 04.12.2007, 18:54   #5
pluton
ViP
 
Аватар для pluton
 
Пол:Мужской
Регистрация: 23.02.2007
Сообщений: 1,027
Репутация: 560
По умолчанию Ответ: Оптимизация алгоритма

Цитата:
Сообщение от voidarg Посмотреть сообщение
Имелись ввиду функции itoa, ltoa и ultoa

странно, но этих функций нет в описании The GNU C Library. а моя прога должна соответствовать GNU C++.

Цитата:
Сообщение от voidarg Посмотреть сообщение
Опять же вопрос в том в какие системы Вы пытаетесь переводить из десятичной.

системы - 2...16.
Цитата:
Сообщение от voidarg Посмотреть сообщение
Если в "любую" то для 12-тиричной Вам придется использовать римские цифры, а для 15-тиричной я вообще не в курсе как и что обозначать

для 12-ричной цифры - 0...9, A, B, C.
15-ричная аналогично - 0...9, A...E.

и всё-таки ктото знает как ускорить преобразование?
__________________
THE TRUTH IS OUT THERE
pluton вне форума
 
Ответить с цитированием Вверх
Старый 04.12.2007, 22:26   #6
alpryk
Новичок
 
Регистрация: 01.06.2007
Адрес: Херсон, Украина
Сообщений: 13
Репутация: 8
По умолчанию Ответ: Оптимизация алгоритма

Цитата:
собственно, я думаю надо убрать строку str, а остатки записывать сразу в out в обратном порядке. тут возникает проблема определения длины строки с числом в новой системе счисления

количество цифр в новой системе по идее вычисляется так:

floor(log10(num) / log10(system)) + 1
alpryk вне форума
 
Ответить с цитированием Вверх
Старый 18.07.2008, 13:37   #7
seimur
Неактивный пользователь
 
Пол:Мужской
Регистрация: 04.12.2007
Сообщений: 32
Репутация: 4
По умолчанию Ответ: Оптимизация алгоритма

Функция перевода в базу с основаниями от 2 до 10..
добавте проверку на входные параметры.

Код:
long convert2(long num, int radix)
{
	long converted = 0;
	long mul10 = 1;

	while( num )
	{
		converted += mul10 * ( num % radix );
		mul10 *= 10;
		num /= radix;
	}

	return (converted);
}
seimur вне форума
 
Ответить с цитированием Вверх
Ответ

Опции темы
Опции просмотра

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация программы Zen2004 Borland C++ Builder 9 19.11.2008 18:42
Многопоточность и Оптимизация в VC++ Ivan_32 Visual C++ / С/C++ 11 02.05.2008 16:57
Оптимизация численности персонала kurthaun Трудовое право 0 22.12.2007 10:23
Оптимизация графики для веб kalancha Вeб Дизайн 12 06.04.2007 06:55

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 02:13. Часовой пояс GMT +3.


Copyright ©2004 - 2025 NoWa.cc

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2026, vBulletin Solutions, Inc. Перевод: zCarot
Время генерации страницы 0.05258 секунды с 13 запросами