Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Перевод числа


Автор: Kernigan 8.8.2006, 18:16
Помогите разобраться с переводом числа из одной системы счисления в другую.

При m > n алгоритм перевода заключается в последовательном делении исходного числа на n, т.е
при переводе десятичного числа 1256(10) получаем 45f(17) 17-ричной системе. А как, в таком случае, перевести 45f(17)  в 25- ричную систему счисления путём такого же деления?

Автор: Kuvaldis 8.8.2006, 18:33
Kernigan,  существует 2 основных способа: простой и сложный
1.Простой: переводим число в исходной с/с (системе счисления) в 10 с/с. Из нее обычным делением на 25 (25 в 10 с/с) и получаем нужный резльтат. Т.е последовательность такая 45f(17 с/с) -  1256(10 с/с) - 56 (25 с/с)

2. Любимый у преподавателей. Нужно разделить число в исходной с/с на новое основание, в данном случае 25, которое записано в 17 с/с. Т.е. 25 (10 с/с) = 17 * 1 + 8 = 18 (17 с/с) и теперь уголком делим 45f на 18 

в 17 с/с  


(это не восемнадцать, а "один восемь" - это ВАЖНО для понимания) (здесь придется промежуточные результаты переводить туда и обратно в 10 с/с)

Автор: Кнером 8.8.2006, 18:39
Напиши 2-3 примера на бумаге. Затем последовательно опиши свои действия. Таким образом ты сам поймешь, что нужно делать. Учись думать своей головой.

Если у тебя что-то не получается, напиши конкретно, что у тебя не получается.
Если за тебя все время другие будут думать, то программист из тебя будет никакой.
А дальше будет сложнее.

http://www.yandex.ru/yandsearch?stype=www&nl=0&text=%EF%E5%F0%E5%E2%EE%E4%EE%EC+%F7%E8%F1%EB%E0+%E8%E7+%EE%E4%ED%EE%E9+%F1%E8%F1%F2%E5%EC%FB+%F1%F7%E8%F1%EB%E5%ED%E8%FF+%E2+%E4%F0%F3%E3%F3%FE

Автор: Kuvaldis 8.8.2006, 18:44
подробно:
 45F : 18
Делим 45 на 18
Очевидно что 45 делится на 18 (45 > 18)
Чтобы узнать целую часть и результат остатка, переводим 45 в 10 с/с: 45 = 4 * 17 + 5 =  770
18 в 17 с/с = 1 * 17 + 8 = 25
Делим обычным методом 770 на 25: 770 = 30 * 25 + 20
Т.е. частное в 10 с/с = 30, а остаток 20
Переводим их обратно в 17 с/с:
30 (10 с/с) = 17 * 1 + 13 = 1D (17 c/c)
20 (10 c/c) = 17 * 1 + 3 = 13 (17 c/c)

при делении в столбик на место первой цифры в частом записываешь 1D, а на место остатка (там, где разность) - 13. 
Теперь сносишь цифру F и таким же образом продолждаешь процесс

Надеюсь, понятно объяснил. Если что, спрашивай smile 

Автор: Kernigan 11.8.2006, 04:40
Цитата

переводим 45 в 10 с/с: 45 = 4 * 17 + 5 =  770



может так
Цитата

45(17) = 4*17+5 = 73(10)
73 / 25 = 2 * 25 + 23

переводим
Цитата

2(10) = 2(17) и 
23(10) = 16(17)

тогда получим
Цитата

216F(17)

 а теперь снова делим 216f / 18 ?

Автор: skyboy 11.8.2006, 10:07
если воспользоваться схемой Горнера, то можно обойтись без перевода в десятичную. Единственное, что потребуется - таблица умножения для однозначных чисел в целевой системе.
например, 101(10) = ?(2)
сначала предсавим основание исходного числа в целевой системе счисления: 
10(10)=1010(2)
Теперь посимвольно(поциферно) будем обрабатывать заданное число:
101
1(10)=1(2) - переводим цифру в целевую систему счисления
Умножаем на представление основания начальной системы в целевой:
1 * 1010 = 1010
добавляем вторую цифру в итоговой системе счисления(0(10)==0(2))
1010 + 0 = 1010
Снова умножаем на 1010
1010 * 1010 = 1010000 + 10100 = 1100100
И прибавляем первую цифру(1(10)=1(2))
1100100 + 1 = 1100101
Последнее число и есть ответ - 101(10) в двоичной системе счисления.
Я мудрёно рассказал, но этот алгоритм имеет преимущества перед переводом в 10 систему:
- меньше действий - меньше вероятность ошибки при переводе "вручную"
- одновременно обрабатывается только один символ начального числа
- все действия(умножение, сложение, перевод одной цифры) можно лугко производить на бумаге, построив только таблицу сложения/умножения для целевой системы счисления.

Автор: Kuvaldis 11.8.2006, 12:06
Kernigan
Цитата

может так

Цитата    

45(17) = 4*17+5 = 73(10)
73 / 25 = 2 * 25 + 23
    

переводим


извини, виноват, затупил (не спеши в следующий раз, это я себе)


Цитата

 а теперь снова делим 216f / 18


да. Идею я тебе правильно объяснил

Автор: Kernigan 13.8.2006, 15:25
Цитата

извини, виноват, затупил (не спеши в следующий раз, это я себе)



Kuvaldis
Не ты один такой. Помнишь 
Цитата

может так ...45(17) = 4*17+5 = 73(10)




Не совсем так.

Цитата

Теперь сносишь цифру F и таким же образом продолждаешь процесс

А зачем сносить?
Если надо разделить 45f / 18? то 
45f = 4 * 17^2 + 5 * 17^1 + 15 = 1256, и тогда, 
1256 / 25 = 50 *25 + 6. Теперь представим 50 в 25-ричной с.с и получим 206(25)

Сейчас пытаюсь понять алгоритм, предложенный skyboy

Автор: skyboy 14.8.2006, 00:49
ща постараюсь не так закрученно...
пускай у нас имеется 230(5) и надо перевести в, скажем ?(10)
преобразование можно сделать так:
2∙5^2 + 3∙5^1 + 0
но выражение можно свернуть:
5∙(2∙5 + 3) - и нам уже прийдётся умножать на 5 не каждое из двух чисел(2∙5 и 3), а их сумму.
Если число будет больше, то:
1342(5) = 1∙5^3 + 3∙5^2 + 4∙5^1 + 2∙5^0 = 5∙(5∙(5∙1 + 3) + 4) + 2
В чём мы выигрываем? В действиях. В их количестве. Где? Когда нам надо было найти 5^4, мы находили 5∙5∙5∙5. Потомо нам надо было найти 5^2, и мы делали 5∙5, при том, что это число мы уже находили, когда искали 5^4, только оно было промежуточным этапом. А если идти последовательным умножением на пять, то этой "лишней работы" мы избегаем. Что осталось? Вести вычисления в той системе счисления, в которую надо перевести число.
Например, 123(4) === ?(3)
В  десятиричной это выглядело бы так: 4*(4*1 + 2) + 3, но в 3 системе счисления нет цифры 4. Потому в 3 системе счисления это будет выглядеть так:
11 * (11 * 1 + 2) + 10 = 11 * 20 + 10 = 220 + 10 = 300(3)
Как несложно убедиться, 123(4) == 27(10) == 300(3)
Вобщем, весь фокус состоит в вычислениях в той  системе счисления, в котороую надо перевести число. 
А фокус со "свёртывнием" полинома от возведения в степень  к каскадному умножению имеет название. Только я его забыл smile
Полином ...(кого-то). 

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