Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Преобразование из "m" в "n" с-му счисления


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

вот соственноhttp://ru.wikipedia.org/wiki/%D0%A1%D1%85%D0%B5%D0%BC%D0%B0_%D0%93%D0%BE%D1%80%D0%BD%D0%B5%D1%80%D0%B0 
http://de.wikipedia.org/wiki/Horner-Schema препод подсказал, что можна сделать с помощью схемы-метода Горнера
Но с какого боку подойти - незнаю. :(
Нужно все это дело на "С" мутить.
Может кто подкинет еще какие то идейки, может кто делал? С чего начать.
Если кто-то делал даже, исходник не бросайте, сам хочу.
Мне б только подсказки, советы.
Спасибо. 

Автор: zim22 4.5.2009, 07:47
Код

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;
}

Автор: Killer_13 4.5.2009, 09:56
забыл дописать, что нельзя пользоваться ф-циями стандартной библиотеки, например "strtoul" и так д... :(
Итоа не стандартная ф-ция, но все равно думаю, что нельзя. :(

Автор: math64 4.5.2009, 10:30
Возьми исходики strtoul и itoa (для gcc они открыты) и сделай как там
Или нужно преобразовывать числа не влезающие в unsigned long и usigned __int64?

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

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

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);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)