Другие языки программирования и технологии

Как перевести периодичную дробь из 3 системы счисления в 10?

0,20(12212110220) нужно в 10 систему счисления перевести. Должно получиться (17/23)
Помогите перевести
0,20(12212110220) =
[2012212110220 - 20] / 2222222222200 =
2012212110200 / 2222222222200 =
20122121102 / 22222222222 = (переводим из 3ной в 10-ю)
130934 / 177146 = (делим на 2)
65467 / 88573 = (делим на 3851)
17 / 23
ВЛ
Василий Ливенский
8 063
Лучший ответ
Гурреев Виктор Спасибо) а почему мы на 2222222222200 делим?
n*(1/3)^i, где i это порядковый номер числа n.
Суммируем для всех i.
Итак, ответ сложный, предупреждаю сразу. Если расчёты не интересуют можно сразу к результирующей формуле перейти (после текста В ИТОГЕ ПОЛУЧАЕМ). Это же ветка программирования, потому решение частной задачи предполагаю бессмысленным и нам нужна формула для общего случая :)

как работают дроби в n-ричных системах счисления?

ну вот например в десятичной
0.5 = 5/10
0.74367346543 = 74367346543/100000000000

То есть это то же самое число делённое на 10^n, где n - количество знаков после запятой, необходимое для записи этого числа

таким образом происходит и в троичной системе (все числа дальше записаны в 3-ой системе... то есть 10 - это десятичное 3):
0.2 = 2/10^1
0.20122 = 20122/10^12 - в десятичной это 179/3^5 = 179/243

Итак, с этим разобрались... теперь следующий этап. Разложим наше число на слогаемые попроще
0.20(12212110220) = 0.20 + 0,00(12212110220) = 0.2 + 0.(12212110220)/10^2

с 0.2 всё просто, его пока не трогаем :) Разберём второе слогаемое поподробнее. Итак, начнём с того, что такое периодическая дробь

например представим такую десятичную запись
0.(1234)

Её можно представить в следующем виде 1234/10^4 + 1234/10^8 + 1234/10^12 + .или
1234/10^(4*1) + 1234/10^(4*2) + 1234/10^(4*3) + .+ 1234/10^(4*∞) = 1234 * (1/10^(4*1) + 1/10^(4*2) + 1/10^(4*3) + .+ 1/10^(4*∞))
то есть это сумма ряда 1234 * ∑(1/10^(4*x)) = 1234 * ∑((1/10^4)^x)

проведя немного расчётов (удачных и не очень), определяем, что бесконечная сумма ряда типа ∑((1/10^n)^x) = 1/(10^n-1), где n - это длина повторяющегося цикла

В ИТОГЕ ПОЛУЧАЕМ:
result = a/b^n1 + k/((b^n2-1)*b^n1) = (a*(b^n2-1) + k)/((b^n2-1)*b^n1), где
b - основание системы (в нашем случае 3)
a - нециклическая часть дроби (в нашем случае троичное 20 или десятичное 6)
k - циклическая часть дроби (в нашем случае троичное 12212110220 или десятичное 115530)
n1 - длина нециклического участка (в нашем случае 2)
n2 - длина циклического участка (в нашем случае 11)

Ну и теперь считаем (6*(3^11-1) + 115530)/((3^11-1)*3^2) = 1178406 / 1594314 (считаем отдельно числитель и отдельно знаменатель, ведь нам дробь нужна)
сокращаем (ищем наибольший общий знаменатель и делим на него, алгоритм можно в сети найти, там всё просто)... и вуаля... на выходе 17/23
Timur Sydykbekov
Timur Sydykbekov
42 958