Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 2 
  Версия для печати (полностью) Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 13.06.2006
Значит, такие дела.
In: Число (DEC), система счисления (DEC)
Out: Число (СИ)

Система от 2ичной до 36ичной. Внимание! Число может быть от 0 до 10^9

Знаю тупой алгоритм: пишем входное число в целочисленную переменную, ищем максимальную степень для основания новой СС, и посимвольно выводим ответ, для каждого символа подбирая множитель и выводя его.
Но... тут не хватает размеров интежера и лонга. А как иначе реализовать - идей пока нет. Помогите пожалуйста.


Вторая проблема:
In: Число (BIN)
Out: Число (HEX)

Я сделал сначала перегнав число в 10чную, потом - в 16чную. Получил на сабмиттере превышение лимита по времени на 1 из тестов.
Получается, надо переводить напрямую в 16. Как это сделать?


Внимание! Стандартные функции перевода СС юзать нельзя. Допустим бородатый ANSI C

_________________
Все что не убивает, делает тебя еще слабее и ущербнее, пока смерть наконец не заберет тебя, тонущего в луже собственного дерьма.



Партнер
 

Member
Статус: Не в сети
Регистрация: 30.07.2006
Откуда: Москва-Ярик
Вот общий вариант:
Код:
uses Windows, SysUtils;


function d2any (v, pwr: Integer): String;
const
     tab: string = '0123456789ABCDEFGHIIJKLMNOPQRSTUVWXYZ';

var i: Integer;
begin
 result := '';
 // right-to-left scan
 while (v > 0) do
  begin
   i := v mod pwr;
   Assert (i < Length (tab), 'large pwr!');
   result := tab[i + 1] + result; // for PASCAL strings using index from 1 to Length(s)
   v := v div pwr;
  end;
 if Result = '' then result := '0';
end;

function b2hex (bs: String): String;

const
   tab: string = '0123456789ABCDEF';

var
   n: Integer;
   v: byte;
begin
 result := '';
 while Length (bs) < 4 do bs := '0' + bs; // complete
 n := 1; // WARN: pascal strings
 // left-to-right scan
 while (n < Length (bs)) do
  begin

   v :=      ( Byte ( bs [n + 3] ) - $30 );
   v := v + ( Byte ( bs [n + 2] ) - $30 ) shl 1;  // v += ( bs [n + 2]  - 0x30 ) << 1;  // C-style expression
   v := v + ( Byte ( bs [n + 1] ) - $30 ) shl 2;
   v := v + ( Byte ( bs [n + 0] ) - $30 ) shl 3;

   result := result + tab [v + 1];

   Inc (n, 4);

  end;
 if result = '' then result := '0';
end;


begin
 WriteLn ( ' 1 000 000 000 = 0x' + d2any (1000000000, 16) + ', binary = ' + d2any (1000000000, 2));
 WriteLn ( ' 10101010 = 0x' + b2hex ( '10101010' ) );
 ReadLn;
end.


Не понимаю, какие проблемы с integer 32 bit? Один миллиард отлично размещается, даже два с небольшим. Впрочем, при желании можно докопаться и до double значений подобным алгоритмом.
Язык Це подзабыл, уже собираюсь Шарп изучать, так что исходник пока только такой.

_________________
Плавайте поездами Аэрофлота!
И синий BSOD нам заменяет небосвод...


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 2 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: kisulja и гости: 12


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

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan