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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование из "m" в "n" с-му счисления, Может подойти схема-метод Горнера 
:(
    Опции темы
Killer_13
Дата 4.5.2009, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нужно  переводить числа из одной системы счисления в другую.
Например, я задаю, 
->перевести число из "3"
в 
->"16" - ричную с-му счисления
->собственно ввожу число.

вот соственно Википедия 
Википедия de препод подсказал, что можна сделать с помощью схемы-метода Горнера
Но с какого боку подойти - незнаю. :(
Нужно все это дело на "С" мутить.
Может кто подкинет еще какие то идейки, может кто делал? С чего начать.
Если кто-то делал даже, исходник не бросайте, сам хочу.
Мне б только подсказки, советы.
Спасибо. 
PM MAIL   Вверх
zim22
Дата 4.5.2009, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Код

char *_itoa(
   int value,
   char *str,
   int radix 
);

radix - база системы счисления. Принимает значения 2–36.

Добавлено @ 07:59
Цитата(Killer_13 @  4.5.2009,  00:48 Найти цитируемый пост)
Но с какого боку подойти - незнаю. :(

Из 3 в 16. Используется метод брутфорса(грубой силы).
Сначала мы генерируем десятичные числа и конвертируем их в 3 систему счисления, пока сгенерированное нами число не совпадёт с введённым пользователем.
А потом полученное 10 число конвертим в 16.
Код

#include <stdlib.h>
#include <cstring>
#include <iostream>

int main()
{
  const char * base3("12111210");
  char buf[256] = {0};

  for (int i = 0; i != 1000000; ++i) {
    itoa(i, buf, 3);
    if (strcmp(base3, buf) == 0) {
      std::cout << "base3: " << base3 << std::endl
                << "i: " << i << std::endl;
      itoa(i, buf, 16);
      std::cout << "base16: " << buf << std::endl;
      break;
    }
  }
    return 0;
}


Это сообщение отредактировал(а) zim22 - 4.5.2009, 08:02


--------------------
PM MAIL   Вверх
Killer_13
Дата 4.5.2009, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



забыл дописать, что нельзя пользоваться ф-циями стандартной библиотеки, например "strtoul" и так д... :(
Итоа не стандартная ф-ция, но все равно думаю, что нельзя. :(
PM MAIL   Вверх
math64
Дата 4.5.2009, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Возьми исходики strtoul и itoa (для gcc они открыты) и сделай как там
Или нужно преобразовывать числа не влезающие в unsigned long и usigned __int64?
PM   Вверх
Killer_13
Дата 4.5.2009, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



smilesmilesmile - не, все должно влазить в этот диапазон. smilesmilesmile
Еще бы подсказали как посмотреть? :( Пользуюсь "cygwin".

Это сообщение отредактировал(а) Killer_13 - 4.5.2009, 10:35
PM MAIL   Вверх
math64
Дата 4.5.2009, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Алгоритм примерно такой (в библиотеке сделано оптимельнее):
Код

bool getdigit(string& digits1, int& digit); // выдаёт цифры слева направо
void putdigit(string& digits2, int digit); // добавляет цифру слева
void decode (string digits1, int base1, string& digits2, int base2)  {
unsigned u = 0;
int d;
while(getdigit(digitts1, d)) {
  u = u * base1 + d;
}
digit2.clear();
do {
  d = u % base2;
  u = u / base2;
  putdigit(digits2, d);
} while (u > 0);


Это сообщение отредактировал(а) math64 - 4.5.2009, 13:41
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0645 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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