Большие числа и системы счислений
От: Dima_ США  
Дата: 10.08.02 09:59
Оценка:
Здравствуйте, люди добрые!

У меня вот такая вот задачка.

Есть число неограниченной длинны т.е. в int не всегда можно запихнуть. Число представленно массивом int*. Каждый элемент в массиве определяет значение разрядя (в определенной системе счисления) соответствущего индексу этого элемента. Массив оканчивается элементом со значением -1. Например 7D009AF в 16-ой системе будет {15,10,9,0,0,14,7,-1}. Массив может быть любой длинны.

Нужно перевести это число в другую систему счисления и записать в такой же массив.

Основания систем счислений в исходном числе и ответе могут быть любые от 2 до 256.

Тут основная проблема в том что это число в int не всегда можно зписать т.к. оно очень большое. По той же пречине не всегда получается записать в int n-ный элемент массива умноженный на основание системы счисления в степени n (n теоретически может быть любая).

Тут нужен оригинальный алгоритм :-\ .

Я уже несколько дней голову над этой задачкой ломаю. Может быть тут есть кто нибудь умнее меня :) ?

Заранее спасибо.
Re: Большие числа и системы счислений
От: Lexey Россия  
Дата: 10.08.02 10:46
Оценка: 3 (1)
Здравствуйте Dima_, Вы писали:

D>Здравствуйте, люди добрые!


D>У меня вот такая вот задачка.


D>Есть число неограниченной длинны т.е. в int не всегда можно запихнуть. Число представленно массивом int*. Каждый элемент в массиве определяет значение разрядя (в определенной системе счисления) соответствущего индексу этого элемента. Массив оканчивается элементом со значением -1. Например 7D009AF в 16-ой системе будет {15,10,9,0,0,14,7,-1}. Массив может быть любой длинны.


D>Нужно перевести это число в другую систему счисления и записать в такой же массив.


D>Основания систем счислений в исходном числе и ответе могут быть любые от 2 до 256.


D>Тут основная проблема в том что это число в int не всегда можно зписать т.к. оно очень большое. По той же пречине не всегда получается записать в int n-ный элемент массива умноженный на основание системы счисления в степени n (n теоретически может быть любая).


D>Тут нужен оригинальный алгоритм .


Вот тебе стандартный алгоритм перевода числа в другую систему счисления, в котором нет ничего оригинального:
1) Представляешь новое основание в текущей системе счисления (например, 10 в в 16-ричной — это 0A).
2) Делишь свое число на новое основание (например, в столбик). Остаток от деления — последняя цифра числа в новой СС.
3) Если частное не 0, то переход к 2 с частным в качестве нового делимого.

Все тупо для безобразия. Деление в столбик, надеюсь, написать сумеешь (есть вроде и более продвинутые алгоритмы деления, но я с ними не знаком)?
Re: Большие числа и системы счислений
От: Sinclair Россия https://github.com/evilguest/
Дата: 11.08.02 00:41
Оценка:
Здравствуйте Dima_, Вы писали:

D>Здравствуйте, люди добрые!


D>У меня вот такая вот задачка.

Что-то мне подсказывает, что надо почитать второй том Кнута. Там очень много чего есть про системы счисления, причем и про представление неограниченных целых тоже есть
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Большие числа и системы счислений
От: fAX Израиль  
Дата: 11.08.02 15:41
Оценка:
Здравствуйте Lexey, Вы писали:

L>Здравствуйте Dima_, Вы писали:


D>>Здравствуйте, люди добрые!


D>>У меня вот такая вот задачка.


D>>Есть число неограниченной длинны т.е. в int не всегда можно запихнуть. Число представленно массивом int*. Каждый элемент в массиве определяет значение разрядя (в определенной системе счисления) соответствущего индексу этого элемента. Массив оканчивается элементом со значением -1. Например 7D009AF в 16-ой системе будет {15,10,9,0,0,14,7,-1}. Массив может быть любой длинны.


D>>Нужно перевести это число в другую систему счисления и записать в такой же массив.


D>>Основания систем счислений в исходном числе и ответе могут быть любые от 2 до 256.


D>>Тут основная проблема в том что это число в int не всегда можно зписать т.к. оно очень большое. По той же пречине не всегда получается записать в int n-ный элемент массива умноженный на основание системы счисления в степени n (n теоретически может быть любая).


D>>Тут нужен оригинальный алгоритм :-\ .


L>Вот тебе стандартный алгоритм перевода числа в другую систему счисления, в котором нет ничего оригинального:

L>1) Представляешь новое основание в текущей системе счисления (например, 10 в в 16-ричной — это 0A).
L>2) Делишь свое число на новое основание (например, в столбик). Остаток от деления — последняя цифра числа в новой СС.
L>3) Если частное не 0, то переход к 2 с частным в качестве нового делимого.

L>Все тупо для безобразия. Деление в столбик, надеюсь, написать сумеешь (есть вроде и более продвинутые алгоритмы деления, но я с ними не знаком)?


Да, ещё обрати внимание, что (если это имеет отношение к делу) если число не целое, а с плавающей точкой, число разделяется на целую и дробную часть. Целая преобразуется довольно интуитивно с помощью целочисленного деления и остатка как было описано выше, а дробная часть несколько иначе (на первый взгляд, с точностью до наоборот).

Значит так.
Имеется число (dn-1dn-2...d1d0d-1...) по основанию b.
Необходимо получить то же число, но по основанию с. Понятно, что
(dn-1dn-2...d1d0d-1...)b = (dn-1*b^(n-1) + dn-2*b^(n-2) + ... + d1*b + d0 + d-1*b^(-1), d = 0..b-1.

Таким образом, для целой части dk получается путём последовательного целочисленного деления по основанию b (от d1 до dn-1).

Для дробной же части выполняется:
(0. d-1d-2d-3d-4...)b = d-1*b^(-1) + d-2*b^(-2) + d-3*b^(-3) + d-4*b^(-4) + ...

Умножив левую часть на b, и взяв целую часть, получим d-1. Далее берём оставшуюся дробную часть и продолжаем...

fAX.
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re[2]: Большие числа и системы счислений
От: Dima_ США  
Дата: 11.08.02 21:30
Оценка:
Здравствуйте Lexey, Вы писали:

L>Здравствуйте Dima_, Вы писали:


D>>Здравствуйте, люди добрые!


D>>У меня вот такая вот задачка.


D>>Есть число неограниченной длинны т.е. в int не всегда можно запихнуть. Число представленно массивом int*. Каждый элемент в массиве определяет значение разрядя (в определенной системе счисления) соответствущего индексу этого элемента. Массив оканчивается элементом со значением -1. Например 7D009AF в 16-ой системе будет {15,10,9,0,0,14,7,-1}. Массив может быть любой длинны.


D>>Нужно перевести это число в другую систему счисления и записать в такой же массив.


D>>Основания систем счислений в исходном числе и ответе могут быть любые от 2 до 256.


D>>Тут основная проблема в том что это число в int не всегда можно зписать т.к. оно очень большое. По той же пречине не всегда получается записать в int n-ный элемент массива умноженный на основание системы счисления в степени n (n теоретически может быть любая).


D>>Тут нужен оригинальный алгоритм .


L>Вот тебе стандартный алгоритм перевода числа в другую систему счисления, в котором нет ничего оригинального:

L>1) Представляешь новое основание в текущей системе счисления (например, 10 в в 16-ричной — это 0A).
L>2) Делишь свое число на новое основание (например, в столбик). Остаток от деления — последняя цифра числа в новой СС.
L>3) Если частное не 0, то переход к 2 с частным в качестве нового делимого.

L>Все тупо для безобразия. Деление в столбик, надеюсь, написать сумеешь (есть вроде и более продвинутые алгоритмы деления, но я с ними не знаком)?


Спасибо, всё работает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.