![]() |
|
![]() ![]() ![]() |
|
Kernigan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 18.6.2006 Репутация: нет Всего: нет |
Помогите разобраться с переводом числа из одной системы счисления в другую.
При m > n алгоритм перевода заключается в последовательном делении исходного числа на n, т.е при переводе десятичного числа 1256(10) получаем 45f(17) 17-ричной системе. А как, в таком случае, перевести 45f(17) в 25- ричную систему счисления путём такого же деления? Это сообщение отредактировал(а) Kernigan - 8.8.2006, 18:20 |
|||
|
||||
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 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 с/с) -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
Кнером |
|
|||
![]() тОрмоз ![]() ![]() Профиль Группа: Участник Сообщений: 346 Регистрация: 24.5.2006 Где: Санкт-Петербург Репутация: нет Всего: 19 |
Напиши 2-3 примера на бумаге. Затем последовательно опиши свои действия. Таким образом ты сам поймешь, что нужно делать. Учись думать своей головой.
Если у тебя что-то не получается, напиши конкретно, что у тебя не получается. Если за тебя все время другие будут думать, то программист из тебя будет никакой. А дальше будет сложнее. По теме. |
|||
|
||||
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 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 и таким же образом продолждаешь процесс Надеюсь, понятно объяснил. Если что, спрашивай ![]() -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
Kernigan |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 18.6.2006 Репутация: нет Всего: нет |
может так
переводим
тогда получим
а теперь снова делим 216f / 18 ? |
||||||||
|
|||||||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 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 систему: - меньше действий - меньше вероятность ошибки при переводе "вручную" - одновременно обрабатывается только один символ начального числа - все действия(умножение, сложение, перевод одной цифры) можно лугко производить на бумаге, построив только таблицу сложения/умножения для целевой системы счисления. |
|||
|
||||
Kuvaldis |
|
||||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 1 Всего: 61 |
Kernigan,
извини, виноват, затупил (не спеши в следующий раз, это я себе)
да. Идею я тебе правильно объяснил -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
||||
|
|||||
Kernigan |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 18.6.2006 Репутация: нет Всего: нет |
Kuvaldis, Не ты один такой. Помнишь
Не совсем так.
А зачем сносить? Если надо разделить 45f / 18? то 45f = 4 * 17^2 + 5 * 17^1 + 15 = 1256, и тогда, 1256 / 25 = 50 *25 + 6. Теперь представим 50 в 25-ричной с.с и получим 206(25) Сейчас пытаюсь понять алгоритм, предложенный skyboy |
||||||
|
|||||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 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) Вобщем, весь фокус состоит в вычислениях в той системе счисления, в котороую надо перевести число. А фокус со "свёртывнием" полинома от возведения в степень к каскадному умножению имеет название. Только я его забыл ![]() Полином ...(кого-то). |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |