Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перевод числа, из m - системы в n - систему 
:(
    Опции темы
Kernigan
Дата 8.8.2006, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите разобраться с переводом числа из одной системы счисления в другую.

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


Это сообщение отредактировал(а) Kernigan - 8.8.2006, 18:20
PM MAIL   Вверх
Kuvaldis
Дата 8.8.2006, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



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 с/с)


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Кнером
Дата 8.8.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


тОрмоз
**


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

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



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

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

По теме.

PM MAIL WWW ICQ   Вверх
Kuvaldis
Дата 8.8.2006, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



подробно:
 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 


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Kernigan
Дата 11.8.2006, 04:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

переводим 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 ?

PM MAIL   Вверх
skyboy
Дата 11.8.2006, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



если воспользоваться схемой Горнера, то можно обойтись без перевода в десятичную. Единственное, что потребуется - таблица умножения для однозначных чисел в целевой системе.
например, 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 систему:
- меньше действий - меньше вероятность ошибки при переводе "вручную"
- одновременно обрабатывается только один символ начального числа
- все действия(умножение, сложение, перевод одной цифры) можно лугко производить на бумаге, построив только таблицу сложения/умножения для целевой системы счисления.
PM MAIL   Вверх
Kuvaldis
Дата 11.8.2006, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



Kernigan
Цитата

может так

Цитата    

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

переводим


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


Цитата

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


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


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Kernigan
Дата 13.8.2006, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

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



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

PM MAIL   Вверх
skyboy
Дата 14.8.2006, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



ща постараюсь не так закрученно...
пускай у нас имеется 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
Полином ...(кого-то). 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0963 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


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

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