とても簡単です

次の問題を考慮してください。 端数期間1/81を見つけます。 ソリューションでは、計算機も列による除算も必要ないことを保証します。 まず、81 *が(期間)に等しいことを思い出してください。 期間の長さをnとすると、最初の小数部は次のように記述されます。


 frac1p= fracPeriod10n+ fracPeriod102n+ fracPeriod103n+...


この表現を次の形式に書き換えます。


 frac1p= fracPeriod10n+ frac110n cdot left fracPeriod10n+ frac102n+..\右


最後の式は次のように表すことができます。


 frac1p= frac10n+ frac110n cdot frac1p


さて、今私たちが探していた比率:


p cdotPeriod=10n1


私たちの場合、このIDは次のようになります。


81 cdot=10n1


左右の部分を9で除算すると、次のようになります。


9 cdotPeriod=111...111


1単位で構成され、9で除算される最初の数は111111111です。これは、9による除算の符号から始まります。 元の数の桁の合計で除算します。 左から右に移動し、配当の数値を加算し、各ステップで受け取った金額を記録します。 このアルゴリズムの結果は12345678,9999です。ここでは、右端の数字に達したときにコンマを入力すると、元の数字の桁の合計が無限小数として複製されることを明確にする必要があります。 0.999 ... = 1であることを思い出し、12345679を探していた答えを得ることができます。  frac19n、そのような分数の期間には長さがあります 9n1ケースn-1の期間がわかっている場合、次の期間は、この期間と11111 ...(繰り返しの数 9n1回)22222 ...(繰り返し 9n1回)33333 ...(繰り返し 9n1回)。 右端のセクションは8888..889のようになります。 最後の桁は9です。
そしてもう一つの観察、今フォームの分数のために  frac111n。 この場合、期間の長さは 2 cdot11n1。 ケースn-1の期間がわかっている場合、次の期間は、この期間と10ブロックで構成される数の積に等しくなります。ここで、各ブロックの長さは 2 cdot11n2。 ブロックの構造は次のとおりです。
09090909 ...
18181818 ...
27272727 ...
36363636 ...
...
最後のブロック90909091。  frac111期間09  frac1112期間は09182736455463728191 * 9 = 0082644628099173553719になります。
次の式を確認しました  frac1113。 わかった


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+ya; 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((aa%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=ia; if (check%b)=0 then Period=Period+(check)/b; break; else j=i%b; Period=Period+(ij)/b; i=j; endif; enddo; return Period+")"; EndFunction 


Source: https://habr.com/ru/post/J326110/


All Articles