Integer long division: Difference between revisions
No edit summary |
m (→{{header|RPL}}: Added comments for HP-49 version) |
||
(4 intermediate revisions by 4 users not shown) | |||
Line 17: | Line 17: | ||
=={{header|C++}}== |
=={{header|C++}}== |
||
{{libheader|GMP}} |
{{libheader|GMP}} |
||
< |
<syntaxhighlight lang="cpp">#include <gmpxx.h> |
||
#include <iomanip> |
#include <iomanip> |
||
Line 72: | Line 72: | ||
std::cout << '\n'; |
std::cout << '\n'; |
||
} |
} |
||
}</ |
}</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
Line 91: | Line 91: | ||
=={{header|Common Lisp}}== |
=={{header|Common Lisp}}== |
||
< |
<syntaxhighlight lang="lisp"> |
||
(defun $/ (a b) |
(defun $/ (a b) |
||
"Divide a/b with infinite precision printing each digit as it is calculated and return the period length" |
"Divide a/b with infinite precision printing each digit as it is calculated and return the period length" |
||
Line 114: | Line 114: | ||
() )) |
() )) |
||
</syntaxhighlight> |
|||
⚫ | |||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
Line 132: | Line 132: | ||
partly because the Unicode "overline" might not display properly. |
partly because the Unicode "overline" might not display properly. |
||
In case the overline style is preferred, simply use the following function in the obvious way: |
In case the overline style is preferred, simply use the following function in the obvious way: |
||
< |
<syntaxhighlight lang="jq"># "\u0305" |
||
def overline: explode | map(., 773) | implode;</ |
def overline: explode | map(., 773) | implode;</syntaxhighlight> |
||
< |
<syntaxhighlight lang="jq"># To take advantage of gojq's support for accurate integer division: |
||
def idivide($j): |
def idivide($j): |
||
. as $i |
. as $i |
||
Line 190: | Line 190: | ||
"Period is \($r|length)\n" ; |
"Period is \($r|length)\n" ; |
||
task</ |
task</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
Line 239: | Line 239: | ||
=={{header|Julia}}== |
=={{header|Julia}}== |
||
< |
<syntaxhighlight lang="julia">function f2d(numr, denr) |
||
dpart, remainders, r = "", Dict{BigInt, Int}(), BigInt(numr) % denr |
dpart, remainders, r = "", Dict{BigInt, Int}(), BigInt(numr) % denr |
||
while (r != 0) && !haskey(remainders, r) |
while (r != 0) && !haskey(remainders, r) |
||
Line 270: | Line 270: | ||
testrepeatingdecimals() |
testrepeatingdecimals() |
||
</ |
</syntaxhighlight>{{out}} |
||
<pre> |
<pre> |
||
Line 289: | Line 289: | ||
{{trans|Wren}} |
{{trans|Wren}} |
||
{{libheader|bignum}} |
{{libheader|bignum}} |
||
< |
<syntaxhighlight lang="nim">import strformat, strutils, tables |
||
import bignum |
import bignum |
||
Line 344: | Line 344: | ||
echo &"{a}/{b} = {repr}" |
echo &"{a}/{b} = {repr}" |
||
echo &"Cycle is <{cycle}>" |
echo &"Cycle is <{cycle}>" |
||
echo &"Period is {period}\n"</ |
echo &"Period is {period}\n"</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
Line 392: | Line 392: | ||
=={{header|Perl}}== |
=={{header|Perl}}== |
||
< |
<syntaxhighlight lang="perl">use strict; |
||
use warnings; |
use warnings; |
||
use utf8; |
use utf8; |
||
Line 421: | Line 421: | ||
printf "%10s Period is %5d : %s\n", $_, long_division split '/' |
printf "%10s Period is %5d : %s\n", $_, long_division split '/' |
||
for <0/1 1/1 1/5 1/3 -1/3 1/7 -83/60 1/17 10/13 3227/555 1/149></ |
for <0/1 1/1 1/5 1/3 -1/3 1/7 -83/60 1/17 10/13 3227/555 1/149></syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre> 0/1 Period is 0 : 0 |
<pre> 0/1 Period is 0 : 0 |
||
Line 438: | Line 438: | ||
=={{header|Phix}}== |
=={{header|Phix}}== |
||
Translation of the Python code linked to by the Wren entry, modified to cope with negatives. |
Translation of the Python code linked to by the Wren entry, modified to cope with negatives. |
||
<!--< |
<!--<syntaxhighlight lang="phix">(phixonline)--> |
||
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span> |
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span> |
||
<span style="color: #008080;">procedure</span> <span style="color: #000000;">test</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> |
<span style="color: #008080;">procedure</span> <span style="color: #000000;">test</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> |
||
Line 481: | Line 481: | ||
<span style="color: #0000FF;">{</span><span style="color: #000000;">476837158203125</span><span style="color: #0000FF;">,</span><span style="color: #000000;">9223372036854775808</span><span style="color: #0000FF;">}}[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$-(</span><span style="color: #7060A8;">machine_bits</span><span style="color: #0000FF;">()=</span><span style="color: #000000;">32</span><span style="color: #0000FF;">)]</span> |
<span style="color: #0000FF;">{</span><span style="color: #000000;">476837158203125</span><span style="color: #0000FF;">,</span><span style="color: #000000;">9223372036854775808</span><span style="color: #0000FF;">}}[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$-(</span><span style="color: #7060A8;">machine_bits</span><span style="color: #0000FF;">()=</span><span style="color: #000000;">32</span><span style="color: #0000FF;">)]</span> |
||
<span style="color: #7060A8;">papply</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">,</span><span style="color: #000000;">test</span><span style="color: #0000FF;">)</span> |
<span style="color: #7060A8;">papply</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">,</span><span style="color: #000000;">test</span><span style="color: #0000FF;">)</span> |
||
<!--</ |
<!--</syntaxhighlight>--> |
||
{{out}} |
{{out}} |
||
The results below are on 64 bit, not surprisingly the last example is inaccurate past 16 significant digits on 32 bit (ditto p2js), and hence omitted. |
The results below are on 64 bit, not surprisingly the last example is inaccurate past 16 significant digits on 32 bit (ditto p2js), and hence omitted. |
||
Line 505: | Line 505: | ||
=={{header|Raku}}== |
=={{header|Raku}}== |
||
It's a built-in. |
It's a built-in. |
||
<lang |
<syntaxhighlight lang="raku" line>for 0/1, 1/1, 1/3, 1/7, -83/60, 1/17, 10/13, 3227/555, 5**21/2**63, 1/149, 1/5261 -> $rat { |
||
printf "%35s - Period is %-5s: %s%s\n", $rat.nude.join('/'), .[1].chars, .[0], (.[1].comb Z~ "\c[COMBINING OVERLINE]" xx *).join |
printf "%35s - Period is %-5s: %s%s\n", $rat.nude.join('/'), .[1].chars, .[0], (.[1].comb Z~ "\c[COMBINING OVERLINE]" xx *).join |
||
given $rat.base-repeating |
given $rat.base-repeating |
||
}</ |
}</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre style="overflow:auto;white-space:revert;"> 0/1 - Period is 0 : 0 |
<pre style="overflow:auto;white-space:revert;"> 0/1 - Period is 0 : 0 |
||
Line 522: | Line 522: | ||
1/5261 - Period is 1052 : 0.0̅0̅0̅1̅9̅0̅0̅7̅7̅9̅3̅1̅9̅5̅2̅1̅0̅0̅3̅6̅1̅1̅4̅8̅0̅7̅0̅7̅0̅8̅9̅9̅0̅6̅8̅6̅1̅8̅1̅3̅3̅4̅3̅4̅7̅0̅8̅2̅3̅0̅3̅7̅4̅4̅5̅3̅5̅2̅5̅9̅4̅5̅6̅3̅7̅7̅1̅1̅4̅6̅1̅6̅9̅9̅2̅9̅6̅7̅1̅1̅6̅5̅1̅7̅7̅7̅2̅2̅8̅6̅6̅3̅7̅5̅2̅1̅3̅8̅3̅7̅6̅7̅3̅4̅4̅6̅1̅1̅2̅9̅0̅6̅2̅9̅1̅5̅7̅9̅5̅4̅7̅6̅1̅4̅5̅2̅1̅9̅5̅4̅0̅0̅1̅1̅4̅0̅4̅6̅7̅5̅9̅1̅7̅1̅2̅6̅0̅2̅1̅6̅6̅8̅8̅8̅4̅2̅4̅2̅5̅3̅9̅4̅4̅1̅1̅7̅0̅8̅8̅0̅0̅6̅0̅8̅2̅4̅9̅3̅8̅2̅2̅4̅6̅7̅2̅1̅1̅5̅5̅6̅7̅3̅8̅2̅6̅2̅6̅8̅7̅7̅0̅1̅9̅5̅7̅8̅0̅2̅6̅9̅9̅1̅0̅6̅6̅3̅3̅7̅1̅9̅8̅2̅5̅1̅2̅8̅3̅0̅2̅6̅0̅4̅0̅6̅7̅6̅6̅7̅7̅4̅3̅7̅7̅4̅9̅4̅7̅7̅2̅8̅5̅6̅8̅7̅1̅3̅1̅7̅2̅4̅0̅0̅6̅8̅4̅2̅8̅0̅5̅5̅5̅0̅2̅7̅5̅6̅1̅3̅0̅0̅1̅3̅3̅0̅5̅4̅5̅5̅2̅3̅6̅6̅4̅7̅0̅2̅5̅2̅8̅0̅3̅6̅4̅9̅4̅9̅6̅2̅9̅3̅4̅8̅0̅3̅2̅6̅9̅3̅4̅0̅4̅2̅9̅5̅7̅6̅1̅2̅6̅2̅1̅1̅7̅4̅6̅8̅1̅6̅1̅9̅4̅6̅3̅9̅8̅0̅2̅3̅1̅8̅9̅5̅0̅7̅6̅9̅8̅1̅5̅6̅2̅4̅4̅0̅6̅0̅0̅6̅4̅6̅2̅6̅4̅9̅6̅8̅6̅3̅7̅1̅4̅1̅2̅2̅7̅9̅0̅3̅4̅4̅0̅4̅1̅0̅5̅6̅8̅3̅3̅3̅0̅1̅6̅5̅3̅6̅7̅8̅0̅0̅7̅9̅8̅3̅2̅7̅3̅1̅4̅1̅9̅8̅8̅2̅1̅5̅1̅6̅8̅2̅1̅8̅9̅6̅9̅7̅7̅7̅6̅0̅8̅8̅1̅9̅6̅1̅6̅0̅4̅2̅5̅7̅7̅4̅5̅6̅7̅5̅7̅2̅7̅0̅4̅8̅0̅8̅9̅7̅1̅6̅7̅8̅3̅8̅8̅1̅3̅9̅1̅3̅7̅0̅4̅6̅1̅8̅8̅9̅3̅7̅4̅6̅4̅3̅6̅0̅3̅8̅7̅7̅5̅8̅9̅8̅1̅1̅8̅2̅2̅8̅4̅7̅3̅6̅7̅4̅2̅0̅6̅4̅2̅4̅6̅3̅4̅0̅9̅9̅9̅8̅0̅9̅9̅2̅2̅0̅6̅8̅0̅4̅7̅8̅9̅9̅6̅3̅8̅8̅5̅1̅9̅2̅9̅2̅9̅1̅0̅0̅9̅3̅1̅3̅8̅1̅8̅6̅6̅5̅6̅5̅2̅9̅1̅7̅6̅9̅6̅2̅5̅5̅4̅6̅4̅7̅4̅0̅5̅4̅3̅6̅2̅2̅8̅8̅5̅3̅8̅3̅0̅0̅7̅0̅3̅2̅8̅8̅3̅4̅8̅2̅2̅2̅7̅7̅1̅3̅3̅6̅2̅4̅7̅8̅6̅1̅6̅2̅3̅2̅6̅5̅5̅3̅8̅8̅7̅0̅9̅3̅7̅0̅8̅4̅2̅0̅4̅5̅2̅3̅8̅5̅4̅7̅8̅0̅4̅5̅9̅9̅8̅8̅5̅9̅5̅3̅2̅4̅0̅8̅2̅8̅7̅3̅9̅7̅8̅3̅3̅1̅1̅1̅5̅7̅5̅7̅4̅6̅0̅5̅5̅8̅8̅2̅9̅1̅1̅9̅9̅3̅9̅1̅7̅5̅0̅6̅1̅7̅7̅5̅3̅2̅7̅8̅8̅4̅4̅3̅2̅6̅1̅7̅3̅7̅3̅1̅2̅2̅9̅8̅0̅4̅2̅1̅9̅7̅3̅0̅0̅8̅9̅3̅3̅6̅6̅2̅8̅0̅1̅7̅4̅8̅7̅1̅6̅9̅7̅3̅9̅5̅9̅3̅2̅3̅3̅2̅2̅5̅6̅2̅2̅5̅0̅5̅2̅2̅7̅1̅4̅3̅1̅2̅8̅6̅8̅2̅7̅5̅9̅9̅3̅1̅5̅7̅1̅9̅4̅4̅4̅9̅7̅2̅4̅3̅8̅6̅9̅9̅8̅6̅6̅9̅4̅5̅4̅4̅7̅6̅3̅3̅5̅2̅9̅7̅4̅7̅1̅9̅6̅3̅5̅0̅5̅0̅3̅7̅0̅6̅5̅1̅9̅6̅7̅3̅0̅6̅5̅9̅5̅7̅0̅4̅2̅3̅8̅7̅3̅7̅8̅8̅2̅5̅3̅1̅8̅3̅8̅0̅5̅3̅6̅0̅1̅9̅7̅6̅8̅1̅0̅4̅9̅2̅3̅0̅1̅8̅4̅3̅7̅5̅5̅9̅3̅9̅9̅3̅5̅3̅7̅3̅5̅0̅3̅1̅3̅6̅2̅8̅5̅8̅7̅7̅2̅0̅9̅6̅5̅5̅9̅5̅8̅9̅4̅3̅1̅6̅6̅6̅9̅8̅3̅4̅6̅3̅2̅1̅9̅9̅2̅0̅1̅6̅7̅2̅6̅8̅5̅8̅0̅1̅1̅7̅8̅4̅8̅3̅1̅7̅8̅1̅0̅3̅0̅2̅2̅2̅3̅9̅1̅1̅8̅0̅3̅8̅3̅9̅5̅7̅4̅2̅2̅5̅4̅3̅2̅4̅2̅7̅2̅9̅5̅1̅9̅1̅0̅2̅8̅3̅2̅1̅6̅1̅1̅8̅6̅0̅8̅6̅2̅9̅5̅3̅8̅1̅1̅0̅6̅2̅5̅3̅5̅6̅3̅9̅6̅1̅2̅2̅4̅1̅0̅1̅8̅8̅1̅7̅7̅1̅5̅2̅6̅3̅2̅5̅7̅9̅3̅5̅7̅5̅3̅6̅5̅9̅</pre> |
1/5261 - Period is 1052 : 0.0̅0̅0̅1̅9̅0̅0̅7̅7̅9̅3̅1̅9̅5̅2̅1̅0̅0̅3̅6̅1̅1̅4̅8̅0̅7̅0̅7̅0̅8̅9̅9̅0̅6̅8̅6̅1̅8̅1̅3̅3̅4̅3̅4̅7̅0̅8̅2̅3̅0̅3̅7̅4̅4̅5̅3̅5̅2̅5̅9̅4̅5̅6̅3̅7̅7̅1̅1̅4̅6̅1̅6̅9̅9̅2̅9̅6̅7̅1̅1̅6̅5̅1̅7̅7̅7̅2̅2̅8̅6̅6̅3̅7̅5̅2̅1̅3̅8̅3̅7̅6̅7̅3̅4̅4̅6̅1̅1̅2̅9̅0̅6̅2̅9̅1̅5̅7̅9̅5̅4̅7̅6̅1̅4̅5̅2̅1̅9̅5̅4̅0̅0̅1̅1̅4̅0̅4̅6̅7̅5̅9̅1̅7̅1̅2̅6̅0̅2̅1̅6̅6̅8̅8̅8̅4̅2̅4̅2̅5̅3̅9̅4̅4̅1̅1̅7̅0̅8̅8̅0̅0̅6̅0̅8̅2̅4̅9̅3̅8̅2̅2̅4̅6̅7̅2̅1̅1̅5̅5̅6̅7̅3̅8̅2̅6̅2̅6̅8̅7̅7̅0̅1̅9̅5̅7̅8̅0̅2̅6̅9̅9̅1̅0̅6̅6̅3̅3̅7̅1̅9̅8̅2̅5̅1̅2̅8̅3̅0̅2̅6̅0̅4̅0̅6̅7̅6̅6̅7̅7̅4̅3̅7̅7̅4̅9̅4̅7̅7̅2̅8̅5̅6̅8̅7̅1̅3̅1̅7̅2̅4̅0̅0̅6̅8̅4̅2̅8̅0̅5̅5̅5̅0̅2̅7̅5̅6̅1̅3̅0̅0̅1̅3̅3̅0̅5̅4̅5̅5̅2̅3̅6̅6̅4̅7̅0̅2̅5̅2̅8̅0̅3̅6̅4̅9̅4̅9̅6̅2̅9̅3̅4̅8̅0̅3̅2̅6̅9̅3̅4̅0̅4̅2̅9̅5̅7̅6̅1̅2̅6̅2̅1̅1̅7̅4̅6̅8̅1̅6̅1̅9̅4̅6̅3̅9̅8̅0̅2̅3̅1̅8̅9̅5̅0̅7̅6̅9̅8̅1̅5̅6̅2̅4̅4̅0̅6̅0̅0̅6̅4̅6̅2̅6̅4̅9̅6̅8̅6̅3̅7̅1̅4̅1̅2̅2̅7̅9̅0̅3̅4̅4̅0̅4̅1̅0̅5̅6̅8̅3̅3̅3̅0̅1̅6̅5̅3̅6̅7̅8̅0̅0̅7̅9̅8̅3̅2̅7̅3̅1̅4̅1̅9̅8̅8̅2̅1̅5̅1̅6̅8̅2̅1̅8̅9̅6̅9̅7̅7̅7̅6̅0̅8̅8̅1̅9̅6̅1̅6̅0̅4̅2̅5̅7̅7̅4̅5̅6̅7̅5̅7̅2̅7̅0̅4̅8̅0̅8̅9̅7̅1̅6̅7̅8̅3̅8̅8̅1̅3̅9̅1̅3̅7̅0̅4̅6̅1̅8̅8̅9̅3̅7̅4̅6̅4̅3̅6̅0̅3̅8̅7̅7̅5̅8̅9̅8̅1̅1̅8̅2̅2̅8̅4̅7̅3̅6̅7̅4̅2̅0̅6̅4̅2̅4̅6̅3̅4̅0̅9̅9̅9̅8̅0̅9̅9̅2̅2̅0̅6̅8̅0̅4̅7̅8̅9̅9̅6̅3̅8̅8̅5̅1̅9̅2̅9̅2̅9̅1̅0̅0̅9̅3̅1̅3̅8̅1̅8̅6̅6̅5̅6̅5̅2̅9̅1̅7̅6̅9̅6̅2̅5̅5̅4̅6̅4̅7̅4̅0̅5̅4̅3̅6̅2̅2̅8̅8̅5̅3̅8̅3̅0̅0̅7̅0̅3̅2̅8̅8̅3̅4̅8̅2̅2̅2̅7̅7̅1̅3̅3̅6̅2̅4̅7̅8̅6̅1̅6̅2̅3̅2̅6̅5̅5̅3̅8̅8̅7̅0̅9̅3̅7̅0̅8̅4̅2̅0̅4̅5̅2̅3̅8̅5̅4̅7̅8̅0̅4̅5̅9̅9̅8̅8̅5̅9̅5̅3̅2̅4̅0̅8̅2̅8̅7̅3̅9̅7̅8̅3̅3̅1̅1̅1̅5̅7̅5̅7̅4̅6̅0̅5̅5̅8̅8̅2̅9̅1̅1̅9̅9̅3̅9̅1̅7̅5̅0̅6̅1̅7̅7̅5̅3̅2̅7̅8̅8̅4̅4̅3̅2̅6̅1̅7̅3̅7̅3̅1̅2̅2̅9̅8̅0̅4̅2̅1̅9̅7̅3̅0̅0̅8̅9̅3̅3̅6̅6̅2̅8̅0̅1̅7̅4̅8̅7̅1̅6̅9̅7̅3̅9̅5̅9̅3̅2̅3̅3̅2̅2̅5̅6̅2̅2̅5̅0̅5̅2̅2̅7̅1̅4̅3̅1̅2̅8̅6̅8̅2̅7̅5̅9̅9̅3̅1̅5̅7̅1̅9̅4̅4̅4̅9̅7̅2̅4̅3̅8̅6̅9̅9̅8̅6̅6̅9̅4̅5̅4̅4̅7̅6̅3̅3̅5̅2̅9̅7̅4̅7̅1̅9̅6̅3̅5̅0̅5̅0̅3̅7̅0̅6̅5̅1̅9̅6̅7̅3̅0̅6̅5̅9̅5̅7̅0̅4̅2̅3̅8̅7̅3̅7̅8̅8̅2̅5̅3̅1̅8̅3̅8̅0̅5̅3̅6̅0̅1̅9̅7̅6̅8̅1̅0̅4̅9̅2̅3̅0̅1̅8̅4̅3̅7̅5̅5̅9̅3̅9̅9̅3̅5̅3̅7̅3̅5̅0̅3̅1̅3̅6̅2̅8̅5̅8̅7̅7̅2̅0̅9̅6̅5̅5̅9̅5̅8̅9̅4̅3̅1̅6̅6̅6̅9̅8̅3̅4̅6̅3̅2̅1̅9̅9̅2̅0̅1̅6̅7̅2̅6̅8̅5̅8̅0̅1̅1̅7̅8̅4̅8̅3̅1̅7̅8̅1̅0̅3̅0̅2̅2̅2̅3̅9̅1̅1̅8̅0̅3̅8̅3̅9̅5̅7̅4̅2̅2̅5̅4̅3̅2̅4̅2̅7̅2̅9̅5̅1̅9̅1̅0̅2̅8̅3̅2̅1̅6̅1̅1̅8̅6̅0̅8̅6̅2̅9̅5̅3̅8̅1̅1̅0̅6̅2̅5̅3̅5̅6̅3̅9̅6̅1̅2̅2̅4̅1̅0̅1̅8̅8̅1̅7̅7̅1̅5̅2̅6̅3̅2̅5̅7̅9̅3̅5̅7̅5̅3̅6̅5̅9̅</pre> |
||
=={{header| |
=={{header|RPL}}== |
||
{{works with|HP|48}} |
|||
{{trans|Nim}} |
|||
« DUP2 / |
|||
'''IF''' DUP FP '''THEN''' |
|||
IP "." + ROT ROT <span style="color:grey">@ HP49+: add R→I after IP</span> |
|||
ABS SWAP ABS OVER MOD 10 * { } |
|||
→ quotient n c passed |
|||
« "" |
|||
'''WHILE''' c DUP n < AND '''REPEAT''' |
|||
10 'c' STO* |
|||
'quotient' "0" STO+ |
|||
'''END''' |
|||
'''WHILE''' passed c POS NOT '''REPEAT''' |
|||
'passed' c STO+ |
|||
c n / IP + <span style="color:grey">@ HP49+: replace / IP by IQUOT</span> |
|||
c n MOD 10 * 'c' STO |
|||
'''END''' |
|||
passed c POS DUP2 1 SWAP 1 - SUB |
|||
quotient SWAP + ROT ROT |
|||
OVER SIZE SUB |
|||
'''IF''' DUP "0" == '''THEN''' DROP "" '''END''' |
|||
» |
|||
'''ELSE''' →STR ROT ROT DROP2 "" '''END''' |
|||
» '<span style="color:blue">LDIV</span>' STO <span style="color:grey">@ ''( m n → "quotient.prefix" "repetend" )'' </span> |
|||
« DUP2 "/" SWAP + + " = " + ROT ROT |
|||
<span style="color:blue">LDIV</span> |
|||
'''IF''' DUP SIZE '''THEN''' ")" + SWAP "(" + SWAP + '''ELSE''' DROP '''END''' |
|||
+ |
|||
» '<span style="color:blue">VUDIV</span>' STO <span style="color:grey">@ ''@ ( m n → "m/n = quotient.prefix(repetend)" )'' </span> |
|||
-3227 555 <span style="color:blue">VUDIV</span> |
|||
355 113 <span style="color:blue">VUDIV</span> |
|||
{{out}} |
|||
<pre> |
|||
2: "-3227/555 = -5.8(144)" |
|||
1: 355/113 = 3.(1415929203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168) |
|||
⚫ | |||
=={{header|V (Vlang)}}== |
|||
{{trans|wren}} |
{{trans|wren}} |
||
<lang vlang>import math.big |
<syntaxhighlight lang="v (vlang)">import math.big |
||
const big_ten = big.integer_from_int(10) |
const big_ten = big.integer_from_int(10) |
||
Line 588: | Line 628: | ||
println('period is ${res[2]}\n') |
println('period is ${res[2]}\n') |
||
} |
} |
||
}</ |
}</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
Line 595: | Line 635: | ||
=={{header|Wren}}== |
=={{header|Wren}}== |
||
This is based on the Python code [http://codepad.org/hKboFPd2 here]. |
This is based on the Python code [http://codepad.org/hKboFPd2 here]. |
||
< |
<syntaxhighlight lang="wren">import "./big" for BigInt |
||
var divide = Fn.new { |m, n| |
var divide = Fn.new { |m, n| |
||
Line 649: | Line 689: | ||
System.print("Repetend is '%(res[1])'") |
System.print("Repetend is '%(res[1])'") |
||
System.print("Period is %(res[2])\n") |
System.print("Period is %(res[2])\n") |
||
}</ |
}</syntaxhighlight> |
||
{{out}} |
{{out}} |
Latest revision as of 14:43, 3 January 2024
Write a function that prints the result of the division of two positive integers with infinite precision (only limited by the available memory), stopping before the period starts repeating itself. Return also the length of this period (0 if there is no period).
Demonstrate it with the division 1/149, whose result is 0.0067114093959731543624161073825503355704697986577181208053691275167785234899328859060402684563758389261744966442953020134228187919463087248322147651, where the last 148 digits repeat endlessly.
The result could be stored as a string or simply output to the screen.
Note that the division of any two integers will always produce a period, but if the numerator is an exact multiple of the denominator, or if the denominator contains only the factors 2 and 5, the period will be 0. In the remaining cases, these possible 2's and 5's of the denominator produce a leading number of digits in the quotient, but have no effect on the period.
- References
- Related
C++
#include <gmpxx.h>
#include <iomanip>
#include <iostream>
#include <map>
#include <string>
using big_int = mpz_class;
std::pair<std::string, size_t> divide(const big_int& n, const big_int& d) {
assert(n >= 0);
assert(d > 0);
std::string result = big_int(n / d).get_str();
result += '.';
big_int c = 10 * (n % d);
size_t digits = 0;
std::map<big_int, size_t> seen;
while (seen.count(c) == 0) {
if (c == 0) {
if (result.back() == '.')
result.pop_back();
return {result, 0};
}
seen[c] = digits++;
if (c < d) {
result += '0';
c *= 10;
} else {
result += big_int(c / d).get_str();
c = 10 * (c % d);
}
}
return {result, digits - seen[c]};
}
int main() {
big_int test[][2] = {
{0, 1}, {1, 1}, {1, 5},
{1, 3}, {1, 7}, {83, 60},
{1, 17}, {10, 13}, {3227, 555},
{1, 149}, {1, 5261}, {476837158203125, big_int("9223372036854775808")}};
for (auto [n, d] : test) {
auto [result, period] = divide(n, d);
std::string str = n.get_str();
str += '/';
str += d.get_str();
std::string repetend = result.substr(result.size() - period);
if (repetend.size() > 30)
repetend.replace(15, repetend.size() - 30, "...");
result.resize(result.size() - period);
std::cout << std::setw(35) << str << " = " << result;
if (period != 0)
std::cout << '{' << repetend << "} (period " << period << ')';
std::cout << '\n';
}
}
- Output:
0/1 = 0 1/1 = 1 1/5 = 0.2 1/3 = 0.{3} (period 1) 1/7 = 0.{142857} (period 6) 83/60 = 1.38{3} (period 1) 1/17 = 0.{0588235294117647} (period 16) 10/13 = 0.{769230} (period 6) 3227/555 = 5.8{144} (period 3) 1/149 = 0.{006711409395973...087248322147651} (period 148) 1/5261 = 0.{000190077931952...263257935753659} (period 1052) 476837158203125/9223372036854775808 = 0.000051698788284564229679463043254372678347863256931304931640625
Common Lisp
(defun $/ (a b)
"Divide a/b with infinite precision printing each digit as it is calculated and return the period length"
; ($/ 1 17) => 588235294117647 ; 16
(assert (and (integerp a) (integerp b) (not (zerop b))))
(do* (c
(i0 (1+ (max (factor-multiplicity b 2) (factor-multiplicity b 5)))) ; the position which marks the beginning of the period
(r a (* 10 r)) ; remainder
(i 0 (1+ i)) ; iterations counter
(rem (if (= i i0) r -1) (if (= i i0) r rem)) ) ; the first remainder against which to check for repeating remainders
((and (= r rem) (not (= i i0))) (- i i0))
(multiple-value-setq (c r) (floor r b))
(princ c) ))
(defun factor-multiplicity (n factor)
"Return how many times the factor is contained in n"
; (factor-multiplicity 12 2) => 2
(do* ((i 0 (1+ i))
(n (/ n factor) (/ n factor)) )
((not (integerp n)) i)
() ))
- Output:
($/ 1 149) 00067114093959731543624161073825503355704697986577181208053691275167785234899328859060402684563758389261744966442953020134228187919463087248322147651 148
jq
Adapted from Wren
Works with gojq, the Go implementation of jq
gojq supports unbounded-precision integer arithmetic, which makes light work of the task.
This entry uses the "(repetend)" convention (e.g. 1/3 => 0.(3)), partly because the Unicode "overline" might not display properly. In case the overline style is preferred, simply use the following function in the obvious way:
# "\u0305"
def overline: explode | map(., 773) | implode;
# To take advantage of gojq's support for accurate integer division:
def idivide($j):
. as $i
| ($i % $j) as $mod
| ($i - $mod) / $j ;
# If $m >= 0, $n > 0 then emit [ s, repetend ]
# where s is the string representation of $m/$n (possibly including trailing dots);
# repetend is a string giving the repeating part of the decimal if any.
#
def integer_division($m; $n):
if $m < 0 then "numerator must not be negative" | error
elif $n <= 0 then "denominator must be positive" | error
else ($m | idivide($n) | tostring + ".") as $quotient
| {c: (($m % $n) * 10), $quotient }
| until (.c <= 0 or .c >= $n; .c *= 10 | .quotient += "0")
| . + { digits: "", passed: {}, i: 0, emit: false }
| until (.emit;
(.c | tostring) as $cs
| if .passed|has($cs)
then .quotient = .quotient + .digits[: .passed[$cs]]
| .emit = {quotient, repetend: .digits[.passed[$cs] :] }
else .q = (.c | idivide($n))
| .r = .c % $n
| .passed[$cs] = .i
| .digits += (.q|tostring)
| .i += 1
| .c = .r * 10
end
)
end
| .emit
# move zeros from the tail of .repetend if possible
| until ( .repetend[-1:] != "0" or .quotient[-1:] != "0";
.quotient |= .[:-1]
| .repetend |= "0" + .[:-1] )
| if .repetend != "0" and (.repetend|length > 0)
then [.quotient + "(" + .repetend + ")", .repetend]
else [(.quotient | sub("[.]$"; "")),
(.repetend | if . == "0" then "" else . end)]
end ;
def examples:
[0, 1], [1, 1], [1, 3], [1, 7], [83,60], [1, 17], [10, 13], [3227, 555],
[476837158203125, 9223372036854775808],
[1, 149], [1, 5261]
;
def task:
examples as [$a, $b]
| (integer_division($a; $b)) as [$s, $r]
|"\($a)/\($b) = \($s)",
"Repetend is \($r)",
"Period is \($r|length)\n" ;
task
- Output:
0/1 = 0 Repetend is Period is 0 1/1 = 1 Repetend is Period is 0 1/3 = 0.(3) Repetend is 3 Period is 1 1/7 = 0.(142857) Repetend is 142857 Period is 6 83/60 = 1.38(3) Repetend is 3 Period is 1 1/17 = 0.(0588235294117647) Repetend is 0588235294117647 Period is 16 10/13 = 0.(769230) Repetend is 769230 Period is 6 3227/555 = 5.8(144) Repetend is 144 Period is 3 476837158203125/9223372036854775808 = 0.000051698788284564229679463043254372678347863256931304931640625 Repetend is Period is 0 1/149 = 0.(0067114093959731543624161073825503355704697986577181208053691275167785234899328859060402684563758389261744966442953020134228187919463087248322147651) Repetend is 0067114093959731543624161073825503355704697986577181208053691275167785234899328859060402684563758389261744966442953020134228187919463087248322147651 Period is 148 1/5261 = 0.(00019007793195210036114807070899068618133434708230374453525945637711461699296711651777228663752138376734461129062915795476145219540011404675917126021668884242539441170880060824938224672115567382626877019578026991066337198251283026040676677437749477285687131724006842805550275613001330545523664702528036494962934803269340429576126211746816194639802318950769815624406006462649686371412279034404105683330165367800798327314198821516821896977760881961604257745675727048089716783881391370461889374643603877589811822847367420642463409998099220680478996388519292910093138186656529176962554647405436228853830070328834822277133624786162326553887093708420452385478045998859532408287397833111575746055882911993917506177532788443261737312298042197300893366280174871697395932332256225052271431286827599315719444972438699866945447633529747196350503706519673065957042387378825318380536019768104923018437559399353735031362858772096559589431666983463219920167268580117848317810302223911803839574225432427295191028321611860862953811062535639612241018817715263257935753659) Repetend is 00019007793195210036114807070899068618133434708230374453525945637711461699296711651777228663752138376734461129062915795476145219540011404675917126021668884242539441170880060824938224672115567382626877019578026991066337198251283026040676677437749477285687131724006842805550275613001330545523664702528036494962934803269340429576126211746816194639802318950769815624406006462649686371412279034404105683330165367800798327314198821516821896977760881961604257745675727048089716783881391370461889374643603877589811822847367420642463409998099220680478996388519292910093138186656529176962554647405436228853830070328834822277133624786162326553887093708420452385478045998859532408287397833111575746055882911993917506177532788443261737312298042197300893366280174871697395932332256225052271431286827599315719444972438699866945447633529747196350503706519673065957042387378825318380536019768104923018437559399353735031362858772096559589431666983463219920167268580117848317810302223911803839574225432427295191028321611860862953811062535639612241018817715263257935753659 Period is 1052
Julia
function f2d(numr, denr)
dpart, remainders, r = "", Dict{BigInt, Int}(), BigInt(numr) % denr
while (r != 0) && !haskey(remainders, r)
remainders[r] = length(dpart)
r *= 10
partrem, r = divrem(r, denr)
dpart *= string(partrem)
end
return r == 0 ? (0, 0) : (dpart[remainders[r]+1:end], remainders[r])
end
overline(s) = mapreduce(c -> "\u0305" * c, *, s)
testpairs = [(0, 1), (1, 1), (1, 3), (1, 7), (-83, 60), (1, 17), (10, 13), (3227, 555),
(5^21, Int128(2)^63), (1, 149), (1, 5261)]
function testrepeatingdecimals()
for (numr, denr) in testpairs
n = numr < 0 ? -numr : numr
repeated, extra = f2d(n, denr)
if repeated == 0
println(lpad("$numr/$denr", 36), " (Period 0) = ", BigFloat(numr)/denr)
else
prefix, suffix = split(string(BigFloat(numr) / denr)[begin:end-2], ".")
println(lpad("$numr/$denr", 36), " (Period ", rpad("$(length(repeated)))", 6),
" = $prefix.$(suffix[begin:extra])$(overline(repeated))")
end
end
end
testrepeatingdecimals()
- Output:
0/1 (Period 0) = 0.0 1/1 (Period 0) = 1.0 1/3 (Period 1) = 0.̅3 1/7 (Period 6) = 0.̅1̅4̅2̅8̅5̅7 -83/60 (Period 1) = -1.38̅3 1/17 (Period 16) = 0.̅0̅5̅8̅8̅2̅3̅5̅2̅9̅4̅1̅1̅7̅6̅4̅7 10/13 (Period 6) = 0.̅7̅6̅9̅2̅3̅0 3227/555 (Period 3) = 5.8̅1̅4̅4 476837158203125/9223372036854775808 (Period 0) = 5.1698788284564229679463043254372678347863256931304931640625e-05 1/149 (Period 148) = 0.̅0̅0̅6̅7̅1̅1̅4̅0̅9̅3̅9̅5̅9̅7̅3̅1̅5̅4̅3̅6̅2̅4̅1̅6̅1̅0̅7̅3̅8̅2̅5̅5̅0̅3̅3̅5̅5̅7̅0̅4̅6̅9̅7̅9̅8̅6̅5̅7̅7̅1̅8̅1̅2̅0̅8̅0̅5̅3̅6̅9̅1̅2̅7̅5̅1̅6̅7̅7̅8̅5̅2̅3̅4̅8̅9̅9̅3̅2̅8̅8̅5̅9̅0̅6̅0̅4̅0̅2̅6̅8̅4̅5̅6̅3̅7̅5̅8̅3̅8̅9̅2̅6̅1̅7̅4̅4̅9̅6̅6̅4̅4̅2̅9̅5̅3̅0̅2̅0̅1̅3̅4̅2̅2̅8̅1̅8̅7̅9̅1̅9̅4̅6̅3̅0̅8̅7̅2̅4̅8̅3̅2̅2̅1̅4̅7̅6̅5̅1 1/5261 (Period 1052) = 0.̅0̅0̅0̅1̅9̅0̅0̅7̅7̅9̅3̅1̅9̅5̅2̅1̅0̅0̅3̅6̅1̅1̅4̅8̅0̅7̅0̅7̅0̅8̅9̅9̅0̅6̅8̅6̅1̅8̅1̅3̅3̅4̅3̅4̅7̅0̅8̅2̅3̅0̅3̅7̅4̅4̅5̅3̅5̅2̅5̅9̅4̅5̅6̅3̅7̅7̅1̅1̅4̅6̅1̅6̅9̅9̅2̅9̅6̅7̅1̅1̅6̅5̅1̅7̅7̅7̅2̅2̅8̅6̅6̅3̅7̅5̅2̅1̅3̅8̅3̅7̅6̅7̅3̅4̅4̅6̅1̅1̅2̅9̅0̅6̅2̅9̅1̅5̅7̅9̅5̅4̅7̅6̅1̅4̅5̅2̅1̅9̅5̅4̅0̅0̅1̅1̅4̅0̅4̅6̅7̅5̅9̅1̅7̅1̅2̅6̅0̅2̅1̅6̅6̅8̅8̅8̅4̅2̅4̅2̅5̅3̅9̅4̅4̅1̅1̅7̅0̅8̅8̅0̅0̅6̅0̅8̅2̅4̅9̅3̅8̅2̅2̅4̅6̅7̅2̅1̅1̅5̅5̅6̅7̅3̅8̅2̅6̅2̅6̅8̅7̅7̅0̅1̅9̅5̅7̅8̅0̅2̅6̅9̅9̅1̅0̅6̅6̅3̅3̅7̅1̅9̅8̅2̅5̅1̅2̅8̅3̅0̅2̅6̅0̅4̅0̅6̅7̅6̅6̅7̅7̅4̅3̅7̅7̅4̅9̅4̅7̅7̅2̅8̅5̅6̅8̅7̅1̅3̅1̅7̅2̅4̅0̅0̅6̅8̅4̅2̅8̅0̅5̅5̅5̅0̅2̅7̅5̅6̅1̅3̅0̅0̅1̅3̅3̅0̅5̅4̅5̅5̅2̅3̅6̅6̅4̅7̅0̅2̅5̅2̅8̅0̅3̅6̅4̅9̅4̅9̅6̅2̅9̅3̅4̅8̅0̅3̅2̅6̅9̅3̅4̅0̅4̅2̅9̅5̅7̅6̅1̅2̅6̅2̅1̅1̅7̅4̅6̅8̅1̅6̅1̅9̅4̅6̅3̅9̅8̅0̅2̅3̅1̅8̅9̅5̅0̅7̅6̅9̅8̅1̅5̅6̅2̅4̅4̅0̅6̅0̅0̅6̅4̅6̅2̅6̅4̅9̅6̅8̅6̅3̅7̅1̅4̅1̅2̅2̅7̅9̅0̅3̅4̅4̅0̅4̅1̅0̅5̅6̅8̅3̅3̅3̅0̅1̅6̅5̅3̅6̅7̅8̅0̅0̅7̅9̅8̅3̅2̅7̅3̅1̅4̅1̅9̅8̅8̅2̅1̅5̅1̅6̅8̅2̅1̅8̅9̅6̅9̅7̅7̅7̅6̅0̅8̅8̅1̅9̅6̅1̅6̅0̅4̅2̅5̅7̅7̅4̅5̅6̅7̅5̅7̅2̅7̅0̅4̅8̅0̅8̅9̅7̅1̅6̅7̅8̅3̅8̅8̅1̅3̅9̅1̅3̅7̅0̅4̅6̅1̅8̅8̅9̅3̅7̅4̅6̅4̅3̅6̅0̅3̅8̅7̅7̅5̅8̅9̅8̅1̅1̅8̅2̅2̅8̅4̅7̅3̅6̅7̅4̅2̅0̅6̅4̅2̅4̅6̅3̅4̅0̅9̅9̅9̅8̅0̅9̅9̅2̅2̅0̅6̅8̅0̅4̅7̅8̅9̅9̅6̅3̅8̅8̅5̅1̅9̅2̅9̅2̅9̅1̅0̅0̅9̅3̅1̅3̅8̅1̅8̅6̅6̅5̅6̅5̅2̅9̅1̅7̅6̅9̅6̅2̅5̅5̅4̅6̅4̅7̅4̅0̅5̅4̅3̅6̅2̅2̅8̅8̅5̅3̅8̅3̅0̅0̅7̅0̅3̅2̅8̅8̅3̅4̅8̅2̅2̅2̅7̅7̅1̅3̅3̅6̅2̅4̅7̅8̅6̅1̅6̅2̅3̅2̅6̅5̅5̅3̅8̅8̅7̅0̅9̅3̅7̅0̅8̅4̅2̅0̅4̅5̅2̅3̅8̅5̅4̅7̅8̅0̅4̅5̅9̅9̅8̅8̅5̅9̅5̅3̅2̅4̅0̅8̅2̅8̅7̅3̅9̅7̅8̅3̅3̅1̅1̅1̅5̅7̅5̅7̅4̅6̅0̅5̅5̅8̅8̅2̅9̅1̅1̅9̅9̅3̅9̅1̅7̅5̅0̅6̅1̅7̅7̅5̅3̅2̅7̅8̅8̅4̅4̅3̅2̅6̅1̅7̅3̅7̅3̅1̅2̅2̅9̅8̅0̅4̅2̅1̅9̅7̅3̅0̅0̅8̅9̅3̅3̅6̅6̅2̅8̅0̅1̅7̅4̅8̅7̅1̅6̅9̅7̅3̅9̅5̅9̅3̅2̅3̅3̅2̅2̅5̅6̅2̅2̅5̅0̅5̅2̅2̅7̅1̅4̅3̅1̅2̅8̅6̅8̅2̅7̅5̅9̅9̅3̅1̅5̅7̅1̅9̅4̅4̅4̅9̅7̅2̅4̅3̅8̅6̅9̅9̅8̅6̅6̅9̅4̅5̅4̅4̅7̅6̅3̅3̅5̅2̅9̅7̅4̅7̅1̅9̅6̅3̅5̅0̅5̅0̅3̅7̅0̅6̅5̅1̅9̅6̅7̅3̅0̅6̅5̅9̅5̅7̅0̅4̅2̅3̅8̅7̅3̅7̅8̅8̅2̅5̅3̅1̅8̅3̅8̅0̅5̅3̅6̅0̅1̅9̅7̅6̅8̅1̅0̅4̅9̅2̅3̅0̅1̅8̅4̅3̅7̅5̅5̅9̅3̅9̅9̅3̅5̅3̅7̅3̅5̅0̅3̅1̅3̅6̅2̅8̅5̅8̅7̅7̅2̅0̅9̅6̅5̅5̅9̅5̅8̅9̅4̅3̅1̅6̅6̅6̅9̅8̅3̅4̅6̅3̅2̅1̅9̅9̅2̅0̅1̅6̅7̅2̅6̅8̅5̅8̅0̅1̅1̅7̅8̅4̅8̅3̅1̅7̅8̅1̅0̅3̅0̅2̅2̅2̅3̅9̅1̅1̅8̅0̅3̅8̅3̅9̅5̅7̅4̅2̅2̅5̅4̅3̅2̅4̅2̅7̅2̅9̅5̅1̅9̅1̅0̅2̅8̅3̅2̅1̅6̅1̅1̅8̅6̅0̅8̅6̅2̅9̅5̅3̅8̅1̅1̅0̅6̅2̅5̅3̅5̅6̅3̅9̅6̅1̅2̅2̅4̅1̅0̅1̅8̅8̅1̅7̅7̅1̅5̅2̅6̅3̅2̅5̅7̅9̅3̅5̅7̅5̅3̅6̅5̅9
Nim
import strformat, strutils, tables
import bignum
proc divide(m, n: Int): tuple[repr: string; cycle: string; period: int] =
doAssert m >= 0, "m must not be negative."
doAssert n > 0, "n must be positive."
var quotient = &"{m div n}."
var c = m mod n * 10
var zeros = 0
while c > 0 and c < n:
c *= 10
quotient &= '0'
inc zeros
var digits = ""
var passed: Table[string, int]
var i = 0
while true:
let cs = $c
if cs in passed:
let idx = passed[cs]
let prefix = digits[0..<idx]
var cycle = digits[idx..^1]
var repr = &"{quotient}{prefix}({cycle})"
repr = repr.replace("(0)", "").strip(leading = false, trailing = true, {'.'})
let index = repr.find('(')
if index < 0: return (repr, "", 0)
repr = repr.multiReplace(("(", ""), (")", ""))
for _ in 1..zeros:
if cycle[^1] == '0':
repr.setLen(repr.len - 1)
cycle = '0' & cycle[0..^2]
else:
break
return (repr & "...", cycle, cycle.len)
let q = c div n
let r = c mod n
passed[cs] = i
digits &= $q
inc i
c = r * 10
const Tests = [("0", "1"), ("1", "1"), ("1", "3"), ("1", "7"),
("83","60"), ("1", "17"), ("10", "13"), ("3227", "555"),
("476837158203125", "9223372036854775808"), ("1", "149"), ("1", "5261")]
for test in Tests:
let a = newInt(test[0])
let b = newInt(test[1])
let (repr, cycle, period) = divide(a, b)
echo &"{a}/{b} = {repr}"
echo &"Cycle is <{cycle}>"
echo &"Period is {period}\n"
- Output:
0/1 = 0 Cycle is <> Period is 0 1/1 = 1 Cycle is <> Period is 0 1/3 = 0.3... Cycle is <3> Period is 1 1/7 = 0.142857... Cycle is <142857> Period is 6 83/60 = 1.383... Cycle is <3> Period is 1 1/17 = 0.0588235294117647... Cycle is <0588235294117647> Period is 16 10/13 = 0.769230... Cycle is <769230> Period is 6 3227/555 = 5.8144... Cycle is <144> Period is 3 476837158203125/9223372036854775808 = 0.000051698788284564229679463043254372678347863256931304931640625 Cycle is <> Period is 0 1/149 = 0.0067114093959731543624161073825503355704697986577181208053691275167785234899328859060402684563758389261744966442953020134228187919463087248322147651... Cycle is <0067114093959731543624161073825503355704697986577181208053691275167785234899328859060402684563758389261744966442953020134228187919463087248322147651> Period is 148 1/5261 = 0.00019007793195210036114807070899068618133434708230374453525945637711461699296711651777228663752138376734461129062915795476145219540011404675917126021668884242539441170880060824938224672115567382626877019578026991066337198251283026040676677437749477285687131724006842805550275613001330545523664702528036494962934803269340429576126211746816194639802318950769815624406006462649686371412279034404105683330165367800798327314198821516821896977760881961604257745675727048089716783881391370461889374643603877589811822847367420642463409998099220680478996388519292910093138186656529176962554647405436228853830070328834822277133624786162326553887093708420452385478045998859532408287397833111575746055882911993917506177532788443261737312298042197300893366280174871697395932332256225052271431286827599315719444972438699866945447633529747196350503706519673065957042387378825318380536019768104923018437559399353735031362858772096559589431666983463219920167268580117848317810302223911803839574225432427295191028321611860862953811062535639612241018817715263257935753659... Cycle is <00019007793195210036114807070899068618133434708230374453525945637711461699296711651777228663752138376734461129062915795476145219540011404675917126021668884242539441170880060824938224672115567382626877019578026991066337198251283026040676677437749477285687131724006842805550275613001330545523664702528036494962934803269340429576126211746816194639802318950769815624406006462649686371412279034404105683330165367800798327314198821516821896977760881961604257745675727048089716783881391370461889374643603877589811822847367420642463409998099220680478996388519292910093138186656529176962554647405436228853830070328834822277133624786162326553887093708420452385478045998859532408287397833111575746055882911993917506177532788443261737312298042197300893366280174871697395932332256225052271431286827599315719444972438699866945447633529747196350503706519673065957042387378825318380536019768104923018437559399353735031362858772096559589431666983463219920167268580117848317810302223911803839574225432427295191028321611860862953811062535639612241018817715263257935753659> Period is 1052
Perl
use strict;
use warnings;
use utf8;
binmode(STDOUT, ':utf8');
sub long_division {
my($n, $d) = @_;
my %seen;
my($numerator,$denominator) = (abs $n, abs $d);
my $negative = ($n < 0 xor $d < 0) ? '-' : '';
my $fraction = sprintf '%d.', $numerator / $denominator;
my $position = length $fraction;
$numerator %= $denominator;
while (!$seen{$numerator}) {
return 0, $fraction =~ s/\.$//r unless $numerator;
$seen{$numerator} = $position;
$fraction .= int 10 * $numerator / $denominator;
$numerator = 10 * $numerator % $denominator;
$position++;
}
my $period = length($fraction) - $seen{$numerator};
substr($fraction, $seen{$numerator}+(2*$_)+1, 0, "\N{COMBINING OVERLINE}") for 0 .. $period-1;
$period, $negative . $fraction
}
printf "%10s Period is %5d : %s\n", $_, long_division split '/'
for <0/1 1/1 1/5 1/3 -1/3 1/7 -83/60 1/17 10/13 3227/555 1/149>
- Output:
0/1 Period is 0 : 0 1/1 Period is 0 : 1 1/5 Period is 0 : 0.2 1/3 Period is 1 : 0.3̅ -1/3 Period is 1 : -0.3̅ 1/7 Period is 6 : 0.1̅4̅2̅8̅5̅7̅ -83/60 Period is 1 : -1.383̅ 1/17 Period is 16 : 0.0̅5̅8̅8̅2̅3̅5̅2̅9̅4̅1̅1̅7̅6̅4̅7̅ 10/13 Period is 6 : 0.7̅6̅9̅2̅3̅0̅ 3227/555 Period is 3 : 5.81̅4̅4̅ 476837158203125/9223372036854775808 Period is 0 : 0.0000516987882845642321427703791414387524127960205078125 1/149 Period is 148 : 0.0̅0̅6̅7̅1̅1̅4̅0̅9̅3̅9̅5̅9̅7̅3̅1̅5̅4̅3̅6̅2̅4̅1̅6̅1̅0̅7̅3̅8̅2̅5̅5̅0̅3̅3̅5̅5̅7̅0̅4̅6̅9̅7̅9̅8̅6̅5̅7̅7̅1̅8̅1̅2̅0̅8̅0̅5̅3̅6̅9̅1̅2̅7̅5̅1̅6̅7̅7̅8̅5̅2̅3̅4̅8̅9̅9̅3̅2̅8̅8̅5̅9̅0̅6̅0̅4̅0̅2̅6̅8̅4̅5̅6̅3̅7̅5̅8̅3̅8̅9̅2̅6̅1̅7̅4̅4̅9̅6̅6̅4̅4̅2̅9̅5̅3̅0̅2̅0̅1̅3̅4̅2̅2̅8̅1̅8̅7̅9̅1̅9̅4̅6̅3̅0̅8̅7̅2̅4̅8̅3̅2̅2̅1̅4̅7̅6̅5̅1̅
Phix
Translation of the Python code linked to by the Wren entry, modified to cope with negatives.
with javascript_semantics procedure test(sequence s) atom {n,d} = s, {numr,denr} = {abs(n),abs(d)}, c = 10*remainder(numr,denr) string sgn = iff(sign(n)*sign(d)=-1?"-":""), q = sprintf("%s%d.",{sgn,floor(numr/denr)}), digits = "" while c and c<denr do c *= 10 q &= '0' end while integer passed = new_dict() while getd_index(c,passed)=NULL do integer digit = floor(c/denr) assert(digit>=0 and digit<=9) digits &= '0'+digit setd(c,length(digits),passed) c = 10*remainder(c,denr) end while integer pc = getd(c,passed) destroy_dict(passed) q &= digits[1..pc-1] digits = digits[pc..$] if digits="0" then q = trim_tail(q,'.') else while digits[$] = q[$] do {digits,q} = {q[$]&digits[1..$-1],q[1..$-1]} end while integer ld = length(digits) if ld>20 then digits[11..-11] = "..." end if q = sprintf("%s{%s} (period %d)",{q,digits,ld}) end if string nod = sprintf("%d/%d",{n,d}) printf(1,"%40s = %s\n",{nod,q}) end procedure constant tests = {{0,1},{1,1},{1,3},{-1,3},{1,-3},{-1,-3},{-17,2},{177,16}, {1,7},{-83,60},{1,17},{10,13},{3227,555},{1,149},{1,5261}, {476837158203125,9223372036854775808}}[1..$-(machine_bits()=32)] papply(tests,test)
- Output:
The results below are on 64 bit, not surprisingly the last example is inaccurate past 16 significant digits on 32 bit (ditto p2js), and hence omitted.
0/1 = 0 1/1 = 1 1/3 = 0.{3} (period 1) -1/3 = -0.{3} (period 1) 1/-3 = -0.{3} (period 1) -1/-3 = 0.{3} (period 1) -17/2 = -8.5 177/16 = 11.0625 1/7 = 0.{142857} (period 6) -83/60 = -1.38{3} (period 1) 1/17 = 0.{0588235294117647} (period 16) 10/13 = 0.{769230} (period 6) 3227/555 = 5.8{144} (period 3) 1/149 = 0.{0067114093...8322147651} (period 148) 1/5261 = 0.{0001900779...7935753659} (period 1052) 476837158203125/9223372036854775808 = 0.000051698788284564229679463043254372678347863256931304931640625
Raku
It's a built-in.
for 0/1, 1/1, 1/3, 1/7, -83/60, 1/17, 10/13, 3227/555, 5**21/2**63, 1/149, 1/5261 -> $rat {
printf "%35s - Period is %-5s: %s%s\n", $rat.nude.join('/'), .[1].chars, .[0], (.[1].comb Z~ "\c[COMBINING OVERLINE]" xx *).join
given $rat.base-repeating
}
- Output:
0/1 - Period is 0 : 0 1/1 - Period is 0 : 1 1/3 - Period is 1 : 0.3̅ 1/7 - Period is 6 : 0.1̅4̅2̅8̅5̅7̅ -83/60 - Period is 1 : -1.383̅ 1/17 - Period is 16 : 0.0̅5̅8̅8̅2̅3̅5̅2̅9̅4̅1̅1̅7̅6̅4̅7̅ 10/13 - Period is 6 : 0.7̅6̅9̅2̅3̅0̅ 3227/555 - Period is 3 : 5.81̅4̅4̅ 476837158203125/9223372036854775808 - Period is 0 : 0.000051698788284564229679463043254372678347863256931304931640625 1/149 - Period is 148 : 0.0̅0̅6̅7̅1̅1̅4̅0̅9̅3̅9̅5̅9̅7̅3̅1̅5̅4̅3̅6̅2̅4̅1̅6̅1̅0̅7̅3̅8̅2̅5̅5̅0̅3̅3̅5̅5̅7̅0̅4̅6̅9̅7̅9̅8̅6̅5̅7̅7̅1̅8̅1̅2̅0̅8̅0̅5̅3̅6̅9̅1̅2̅7̅5̅1̅6̅7̅7̅8̅5̅2̅3̅4̅8̅9̅9̅3̅2̅8̅8̅5̅9̅0̅6̅0̅4̅0̅2̅6̅8̅4̅5̅6̅3̅7̅5̅8̅3̅8̅9̅2̅6̅1̅7̅4̅4̅9̅6̅6̅4̅4̅2̅9̅5̅3̅0̅2̅0̅1̅3̅4̅2̅2̅8̅1̅8̅7̅9̅1̅9̅4̅6̅3̅0̅8̅7̅2̅4̅8̅3̅2̅2̅1̅4̅7̅6̅5̅1̅ 1/5261 - Period is 1052 : 0.0̅0̅0̅1̅9̅0̅0̅7̅7̅9̅3̅1̅9̅5̅2̅1̅0̅0̅3̅6̅1̅1̅4̅8̅0̅7̅0̅7̅0̅8̅9̅9̅0̅6̅8̅6̅1̅8̅1̅3̅3̅4̅3̅4̅7̅0̅8̅2̅3̅0̅3̅7̅4̅4̅5̅3̅5̅2̅5̅9̅4̅5̅6̅3̅7̅7̅1̅1̅4̅6̅1̅6̅9̅9̅2̅9̅6̅7̅1̅1̅6̅5̅1̅7̅7̅7̅2̅2̅8̅6̅6̅3̅7̅5̅2̅1̅3̅8̅3̅7̅6̅7̅3̅4̅4̅6̅1̅1̅2̅9̅0̅6̅2̅9̅1̅5̅7̅9̅5̅4̅7̅6̅1̅4̅5̅2̅1̅9̅5̅4̅0̅0̅1̅1̅4̅0̅4̅6̅7̅5̅9̅1̅7̅1̅2̅6̅0̅2̅1̅6̅6̅8̅8̅8̅4̅2̅4̅2̅5̅3̅9̅4̅4̅1̅1̅7̅0̅8̅8̅0̅0̅6̅0̅8̅2̅4̅9̅3̅8̅2̅2̅4̅6̅7̅2̅1̅1̅5̅5̅6̅7̅3̅8̅2̅6̅2̅6̅8̅7̅7̅0̅1̅9̅5̅7̅8̅0̅2̅6̅9̅9̅1̅0̅6̅6̅3̅3̅7̅1̅9̅8̅2̅5̅1̅2̅8̅3̅0̅2̅6̅0̅4̅0̅6̅7̅6̅6̅7̅7̅4̅3̅7̅7̅4̅9̅4̅7̅7̅2̅8̅5̅6̅8̅7̅1̅3̅1̅7̅2̅4̅0̅0̅6̅8̅4̅2̅8̅0̅5̅5̅5̅0̅2̅7̅5̅6̅1̅3̅0̅0̅1̅3̅3̅0̅5̅4̅5̅5̅2̅3̅6̅6̅4̅7̅0̅2̅5̅2̅8̅0̅3̅6̅4̅9̅4̅9̅6̅2̅9̅3̅4̅8̅0̅3̅2̅6̅9̅3̅4̅0̅4̅2̅9̅5̅7̅6̅1̅2̅6̅2̅1̅1̅7̅4̅6̅8̅1̅6̅1̅9̅4̅6̅3̅9̅8̅0̅2̅3̅1̅8̅9̅5̅0̅7̅6̅9̅8̅1̅5̅6̅2̅4̅4̅0̅6̅0̅0̅6̅4̅6̅2̅6̅4̅9̅6̅8̅6̅3̅7̅1̅4̅1̅2̅2̅7̅9̅0̅3̅4̅4̅0̅4̅1̅0̅5̅6̅8̅3̅3̅3̅0̅1̅6̅5̅3̅6̅7̅8̅0̅0̅7̅9̅8̅3̅2̅7̅3̅1̅4̅1̅9̅8̅8̅2̅1̅5̅1̅6̅8̅2̅1̅8̅9̅6̅9̅7̅7̅7̅6̅0̅8̅8̅1̅9̅6̅1̅6̅0̅4̅2̅5̅7̅7̅4̅5̅6̅7̅5̅7̅2̅7̅0̅4̅8̅0̅8̅9̅7̅1̅6̅7̅8̅3̅8̅8̅1̅3̅9̅1̅3̅7̅0̅4̅6̅1̅8̅8̅9̅3̅7̅4̅6̅4̅3̅6̅0̅3̅8̅7̅7̅5̅8̅9̅8̅1̅1̅8̅2̅2̅8̅4̅7̅3̅6̅7̅4̅2̅0̅6̅4̅2̅4̅6̅3̅4̅0̅9̅9̅9̅8̅0̅9̅9̅2̅2̅0̅6̅8̅0̅4̅7̅8̅9̅9̅6̅3̅8̅8̅5̅1̅9̅2̅9̅2̅9̅1̅0̅0̅9̅3̅1̅3̅8̅1̅8̅6̅6̅5̅6̅5̅2̅9̅1̅7̅6̅9̅6̅2̅5̅5̅4̅6̅4̅7̅4̅0̅5̅4̅3̅6̅2̅2̅8̅8̅5̅3̅8̅3̅0̅0̅7̅0̅3̅2̅8̅8̅3̅4̅8̅2̅2̅2̅7̅7̅1̅3̅3̅6̅2̅4̅7̅8̅6̅1̅6̅2̅3̅2̅6̅5̅5̅3̅8̅8̅7̅0̅9̅3̅7̅0̅8̅4̅2̅0̅4̅5̅2̅3̅8̅5̅4̅7̅8̅0̅4̅5̅9̅9̅8̅8̅5̅9̅5̅3̅2̅4̅0̅8̅2̅8̅7̅3̅9̅7̅8̅3̅3̅1̅1̅1̅5̅7̅5̅7̅4̅6̅0̅5̅5̅8̅8̅2̅9̅1̅1̅9̅9̅3̅9̅1̅7̅5̅0̅6̅1̅7̅7̅5̅3̅2̅7̅8̅8̅4̅4̅3̅2̅6̅1̅7̅3̅7̅3̅1̅2̅2̅9̅8̅0̅4̅2̅1̅9̅7̅3̅0̅0̅8̅9̅3̅3̅6̅6̅2̅8̅0̅1̅7̅4̅8̅7̅1̅6̅9̅7̅3̅9̅5̅9̅3̅2̅3̅3̅2̅2̅5̅6̅2̅2̅5̅0̅5̅2̅2̅7̅1̅4̅3̅1̅2̅8̅6̅8̅2̅7̅5̅9̅9̅3̅1̅5̅7̅1̅9̅4̅4̅4̅9̅7̅2̅4̅3̅8̅6̅9̅9̅8̅6̅6̅9̅4̅5̅4̅4̅7̅6̅3̅3̅5̅2̅9̅7̅4̅7̅1̅9̅6̅3̅5̅0̅5̅0̅3̅7̅0̅6̅5̅1̅9̅6̅7̅3̅0̅6̅5̅9̅5̅7̅0̅4̅2̅3̅8̅7̅3̅7̅8̅8̅2̅5̅3̅1̅8̅3̅8̅0̅5̅3̅6̅0̅1̅9̅7̅6̅8̅1̅0̅4̅9̅2̅3̅0̅1̅8̅4̅3̅7̅5̅5̅9̅3̅9̅9̅3̅5̅3̅7̅3̅5̅0̅3̅1̅3̅6̅2̅8̅5̅8̅7̅7̅2̅0̅9̅6̅5̅5̅9̅5̅8̅9̅4̅3̅1̅6̅6̅6̅9̅8̅3̅4̅6̅3̅2̅1̅9̅9̅2̅0̅1̅6̅7̅2̅6̅8̅5̅8̅0̅1̅1̅7̅8̅4̅8̅3̅1̅7̅8̅1̅0̅3̅0̅2̅2̅2̅3̅9̅1̅1̅8̅0̅3̅8̅3̅9̅5̅7̅4̅2̅2̅5̅4̅3̅2̅4̅2̅7̅2̅9̅5̅1̅9̅1̅0̅2̅8̅3̅2̅1̅6̅1̅1̅8̅6̅0̅8̅6̅2̅9̅5̅3̅8̅1̅1̅0̅6̅2̅5̅3̅5̅6̅3̅9̅6̅1̅2̅2̅4̅1̅0̅1̅8̅8̅1̅7̅7̅1̅5̅2̅6̅3̅2̅5̅7̅9̅3̅5̅7̅5̅3̅6̅5̅9̅
RPL
« DUP2 / IF DUP FP THEN IP "." + ROT ROT @ HP49+: add R→I after IP ABS SWAP ABS OVER MOD 10 * { } → quotient n c passed « "" WHILE c DUP n < AND REPEAT 10 'c' STO* 'quotient' "0" STO+ END WHILE passed c POS NOT REPEAT 'passed' c STO+ c n / IP + @ HP49+: replace / IP by IQUOT c n MOD 10 * 'c' STO END passed c POS DUP2 1 SWAP 1 - SUB quotient SWAP + ROT ROT OVER SIZE SUB IF DUP "0" == THEN DROP "" END » ELSE →STR ROT ROT DROP2 "" END » 'LDIV' STO @ ( m n → "quotient.prefix" "repetend" ) « DUP2 "/" SWAP + + " = " + ROT ROT LDIV IF DUP SIZE THEN ")" + SWAP "(" + SWAP + ELSE DROP END + » 'VUDIV' STO @ @ ( m n → "m/n = quotient.prefix(repetend)" )
-3227 555 VUDIV 355 113 VUDIV
- Output:
2: "-3227/555 = -5.8(144)" 1: 355/113 = 3.(1415929203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168)
V (Vlang)
import math.big
const big_ten = big.integer_from_int(10)
fn divide(m big.Integer, n big.Integer) ?[]string {
if m < big.zero_int {
return error('m must not be negative')
}
if n <= big.zero_int {
return error('n must be positive')
}
mut quotient := '${(m/n)}.'
mut c := (m % n) * big_ten
mut zeros := 0
for c > big.zero_int && c < n {
c = c * big_ten
quotient = quotient + "0"
zeros ++
}
mut digits := ""
mut passed := map[string]int{}//string:int
mut i := 0
for {
mut cs := c.str()
if cs in passed {
prefix := digits[0..passed[cs]]
mut repetend := digits[passed[cs]..digits.len]
mut result := '$quotient${prefix}(${repetend})'
result = result.replace("(0)", "").trim_right(".")
index := result.index("(") or {-1}
if index == -1 {
return [result, "", '0']
}
result = result.replace("(", "").replace(")", "")
for _ in 0..zeros {
if repetend[repetend.len-1] == 0 {
result = result[0..result.len-1]
repetend = "0" + repetend[0..result.len-1]
} else {
break
}
}
return [result + "....", repetend, repetend.len.str()]
}
q := c / n
r := c % n
passed[cs] = i
digits += q.str()
i++
c = r * big_ten
}
return ['FAIL','','']
}
fn main(){
for test in [[0, 1], [1, 1], [1, 3], [1, 7], [83,60], [1, 17], [10, 13], [3227, 555],
[476837158203125, 9223372036854775808], [1, 149], [1, 5261]] {
a := big.integer_from_i64(test[0])
b := big.integer_from_i64(test[1])
res := divide(a,b) or {['Need positive numbers','','']}
println('$a/$b = ${res[0]}')
println("repetend is '${res[1]}'")
println('period is ${res[2]}\n')
}
}
- Output:
Similar as wren entry
Wren
This is based on the Python code here.
import "./big" for BigInt
var divide = Fn.new { |m, n|
if (m < 0) Fiber.abort("m must not be negative")
if (n <= 0) Fiber.abort("n must be positive.")
var quotient = (m/n).toString + "."
var c = (m % n) * 10
var zeros = 0
while (c > 0 && c < n) {
c = c * 10
quotient = quotient + "0"
zeros = zeros + 1
}
var digits = ""
var passed = {}
var i = 0
while (true) {
var cs = c.toString
if (passed.containsKey(cs)) {
var prefix = digits[0...passed[cs]]
var repetend = digits[passed[cs]..-1]
var result = quotient + prefix + "(" + repetend + ")"
result = result.replace("(0)", "").trimEnd(".")
var index = result.indexOf("(")
if (index == -1) return [result, "", 0]
result = result.replace("(", "").replace(")", "")
for (i in 0...zeros) {
if (repetend[-1] == "0") {
result = result[0..-2]
repetend = "0" + repetend[0..-2]
} else break
}
return [result + "....", repetend, repetend.count]
}
var q = c / n
var r = c % n
passed[cs] = i
digits = digits + q.toString
i = i + 1
c = r * 10
}
}
var tests = [
[0, 1], [1, 1], [1, 3], [1, 7], [83,60], [1, 17], [10, 13], [3227, 555],
[476837158203125, "9223372036854775808"], [1, 149], [1, 5261]
]
for (test in tests) {
var a = BigInt.new(test[0])
var b = BigInt.new(test[1])
var res = divide.call(a, b)
System.print("%(a)/%(b) = %(res[0])")
System.print("Repetend is '%(res[1])'")
System.print("Period is %(res[2])\n")
}
- Output:
0/1 = 0 Repetend is '' Period is 0 1/1 = 1 Repetend is '' Period is 0 1/3 = 0.3.... Repetend is '3' Period is 1 1/7 = 0.142857.... Repetend is '142857' Period is 6 83/60 = 1.383.... Repetend is '3' Period is 1 1/17 = 0.0588235294117647.... Repetend is '0588235294117647' Period is 16 10/13 = 0.769230.... Repetend is '769230' Period is 6 3227/555 = 5.8144.... Repetend is '144' Period is 3 476837158203125/9223372036854775808 = 0.000051698788284564229679463043254372678347863256931304931640625 Repetend is '' Period is 0 1/149 = 0.0067114093959731543624161073825503355704697986577181208053691275167785234899328859060402684563758389261744966442953020134228187919463087248322147651.... Repetend is '0067114093959731543624161073825503355704697986577181208053691275167785234899328859060402684563758389261744966442953020134228187919463087248322147651' Period is 148 1/5261 = 0.00019007793195210036114807070899068618133434708230374453525945637711461699296711651777228663752138376734461129062915795476145219540011404675917126021668884242539441170880060824938224672115567382626877019578026991066337198251283026040676677437749477285687131724006842805550275613001330545523664702528036494962934803269340429576126211746816194639802318950769815624406006462649686371412279034404105683330165367800798327314198821516821896977760881961604257745675727048089716783881391370461889374643603877589811822847367420642463409998099220680478996388519292910093138186656529176962554647405436228853830070328834822277133624786162326553887093708420452385478045998859532408287397833111575746055882911993917506177532788443261737312298042197300893366280174871697395932332256225052271431286827599315719444972438699866945447633529747196350503706519673065957042387378825318380536019768104923018437559399353735031362858772096559589431666983463219920167268580117848317810302223911803839574225432427295191028321611860862953811062535639612241018817715263257935753659.... Repetend is '00019007793195210036114807070899068618133434708230374453525945637711461699296711651777228663752138376734461129062915795476145219540011404675917126021668884242539441170880060824938224672115567382626877019578026991066337198251283026040676677437749477285687131724006842805550275613001330545523664702528036494962934803269340429576126211746816194639802318950769815624406006462649686371412279034404105683330165367800798327314198821516821896977760881961604257745675727048089716783881391370461889374643603877589811822847367420642463409998099220680478996388519292910093138186656529176962554647405436228853830070328834822277133624786162326553887093708420452385478045998859532408287397833111575746055882911993917506177532788443261737312298042197300893366280174871697395932332256225052271431286827599315719444972438699866945447633529747196350503706519673065957042387378825318380536019768104923018437559399353735031362858772096559589431666983463219920167268580117848317810302223911803839574225432427295191028321611860862953811062535639612241018817715263257935753659' Period is 1052