Как стать автором
Обновить

Это очень просто

Время на прочтение2 мин
Количество просмотров21K

Рассмотрим следующую задачу. Найти период дроби 1/81. Уверяю, что для решения не потребуется ни калькулятор, ни деление столбиком. Для начала вспомним чему равно 81*(Период). Пусть длина периода n, тогда исходная дробь запишется как:


$\frac{1}p=\frac{Период}{10^n}+\frac{Период}{10^{2n}}+\frac{Период}{10^{3n}}+...$


Перепишем данное представление в следующем виде:


$\frac{1}p=\frac{Период}{10^n}+\frac{1}{10^n} \cdot\left(\frac{Период}{10^{n}}+\frac{Период}{10^{2n}}+..\right) $


Последнее выражение можно представить так:


$\frac{1}p=\frac{Период}{10^n}+\frac{1}{10^n} \cdot\frac{1}p$


Ну а теперь то соотношение, которое мы искали:


$p\cdotПериод=10^n-1$


Для нашего случая это тождество будет следующим:


$81 \cdotПериод=10^n-1$


Разделим левую и правую часть на 9, получим:


$9 \cdotПериод=111...111$


Первое число, составленное из одних единиц, которое делится на 9 равно 111111111, это следует из признака делимости на 9. Делить будем через сумму цифр исходного числа. Двигаемся слева направо, складываем цифры делимого и на каждом шаге записываем полученную сумму. Результат работы данного алгоритма — число 12345678,9999… Здесь надо пояснить, что когда мы достигаем крайней правой цифры, то ставим запятую и полученную сумму цифр исходного числа дублируем как бесконечную десятичную дробь. Вспоминаем, что 0,999...=1 и получаем ответ, который мы искали 12345679. Если рассмотреть более общую задачу нахождения периода дроби $\frac{1}{9^n}$, то окажется, что период такой дроби имеет длину ${9^{n-1}}$ и если известен период для случая n-1, то следующий равен произведению данного периода на число вида 11111… (повторяется ${9^{n-1}}$ раз)22222… (повторяется ${9^{n-1}}$ раз)33333… (повторяется ${9^{n-1}}$ раз). Самая правая секция будет иметь вид 8888..889. Последняя цифра девятка.
И еще одно наблюдение, теперь для дробей вида $\frac{1}{11^{n}}$. В этом случае длина периода равна $2\cdot{11^{n-1}}$. И если известен период для случая n-1, то следующий период равен произведению данного периода на число, составленное из 10 блоков, где длина каждого блока $2\cdot{11^{n-2}}$. Блоки имеют следующую структуру:
09090909…
18181818…
27272727…
36363636…

последний блок 90909091. Для $\frac{1}{11}$ период 09, для $\frac{1}{11^{2}}$ период будет 09182736455463728191*9=0082644628099173553719.
Проверил формулу для $\frac{1}{11^{3}}$. Получил


75131480090157776108189331329827197595792637114951164537941397445529676934635612
32156273478587528174305033809166040570999248685199098422238918106686701728024042
0736288504883546205860255447032306536438767843726521412471825694966190833959429,


что совпадает с периодом без ведущих нулей.


Приведу код процедур, которые я использовал для проверки своих выводов.


Function GreatestCommonDivisor(x,y)

    if x=y then
        return x;
    endif;  

    a=min(x,y);
    if a=1 then
        return 1;
    endif;  
    b=x+y-a;

    while TRUE do
     c=b%a; 
     if c=0 then
         return a;
     endif;  
     b=a;
     a=c;
    enddo;

EndFunction

Function NumeratorFractionPeriod(numerator,denumerator)

    // дробь a/b

    a=numerator;
    b=denumerator;

    while b%2=0 do
        b=b/2;
        a=a*5;
    enddo;  

    while b%5=0 do
        b=b/5;
        a=a*2;
    enddo;  
    //наибольший общий делитель
    c=GreatestCommonDivisor(a,b);
    a=a/c;
    b=b/c;

    if b=1 then
        Period=string(a);
        return Period;
    endif;

    if a>b then
        Period=string((a-a%b)/b);
        a=a%b;
        if a=0 then
            return Period;
        endif;  
        Period=Period+"(";
    else
        Period="(";
    endif;      

    while a%10=0 do
        a=a/10;
    enddo;  

    i=a;
    while TRUE do
        j=0;
        while i<b do
            i=i*10;
            j=j+1;
            if j>1 then
             Period=Period+"0";
            endif; 
        enddo;  

        check=i-a;
        if (check%b)=0 then
            Period=Period+(check)/b;
            break;
        else
            j=i%b;
            Period=Period+(i-j)/b;
            i=j;
        endif;    
    enddo;

    return Period+")";
EndFunction 
Теги:
Хабы:
Всего голосов 32: ↑24 и ↓8+16
Комментарии10

Публикации

Истории

Ближайшие события

27 марта
Deckhouse Conf 2025
Москва
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань