Continued fraction/Arithmetic/Construct from rational number: Difference between revisions

Content added Content deleted
Line 2,716: Line 2,716:
As a silly one-liner:
As a silly one-liner:
<syntaxhighlight lang="raku" line>sub r2cf(Rat $x is copy) { gather $x [R/]= 1 while ($x -= take $x.floor) > 0 }</syntaxhighlight>
<syntaxhighlight lang="raku" line>sub r2cf(Rat $x is copy) { gather $x [R/]= 1 while ($x -= take $x.floor) > 0 }</syntaxhighlight>

=={{header|RATFOR}}==
{{works with|ratfor77|[https://sourceforge.net/p/chemoelectric/ratfor77/ public domain 1.0]}}
{{works with|gfortran|12.2.1}}

To get nice output with f2c would have been more tedious than I felt like doing, and so the I/O facilities employed here are more advanced than often was the case with an historical FORTRAN77 compiler.

<syntaxhighlight lang="ratfor">
# This implementation assumes the I/O facilities of gfortran, and so
# is not suited to f2c as the FORTRAN77 compiler.

function r2cf (N1, N2)
implicit none

integer N1, N2
integer r2cf

integer r

# We will use division with rounding towards zero, which is the
# native integer division method of FORTRAN77.
r2cf = N1 / N2
r = mod (N1, N2)

N1 = N2
N2 = r
end

subroutine wrr2cf (N1, N2) # Write r2cf results.
implicit none

integer N1, N2
integer r2cf
integer digit, M1, M2
integer sep

write (*, '(I0, "/", I0, " => ")', advance = "no") N1, N2

M1 = N1
M2 = N2
sep = 0
while (M2 != 0)
{
digit = r2cf (M1, M2)
if (sep == 0)
{
write (*, '("[", I0)', advance = "no") digit
sep = 1
}
else if (sep == 1)
{
write (*, '("; ", I0)', advance = "no") digit
sep = 2
}
else
{
write (*, '(", ", I0)', advance = "no") digit
}
}
write (*, '("]")', advance = "yes")
end

program demo
implicit none

call wrr2cf (1, 2)
call wrr2cf (3, 1)
call wrr2cf (23, 8)
call wrr2cf (13, 11)
call wrr2cf (22, 7)
call wrr2cf (-151, 77)

call wrr2cf (14142, 10000)
call wrr2cf (141421, 100000)
call wrr2cf (1414214, 1000000)
call wrr2cf (14142136, 10000000)

call wrr2cf (31, 10)
call wrr2cf (314, 100)
call wrr2cf (3142, 1000)
call wrr2cf (31428, 10000)
call wrr2cf (314285, 100000)
call wrr2cf (3142857, 1000000)
call wrr2cf (31428571, 10000000)
call wrr2cf (314285714, 100000000)
end
</syntaxhighlight>

{{out}}

<pre>$ (ratfor77 continued-fraction-from-rational.r | gfortran -x f77 -) && ./a.out
1/2 => [0; 2]
3/1 => [3]
23/8 => [2; 1, 7]
13/11 => [1; 5, 2]
22/7 => [3; 7]
-151/77 => [-1; -1, -24, -1, -2]
14142/10000 => [1; 2, 2, 2, 2, 2, 1, 1, 29]
141421/100000 => [1; 2, 2, 2, 2, 2, 2, 3, 1, 1, 3, 1, 7, 2]
1414214/1000000 => [1; 2, 2, 2, 2, 2, 2, 2, 3, 6, 1, 2, 1, 12]
14142136/10000000 => [1; 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 1, 2, 4, 1, 1, 2]
31/10 => [3; 10]
314/100 => [3; 7, 7]
3142/1000 => [3; 7, 23, 1, 2]
31428/10000 => [3; 7, 357]
314285/100000 => [3; 7, 2857]
3142857/1000000 => [3; 7, 142857]
31428571/10000000 => [3; 7, 476190, 3]
314285714/100000000 => [3; 7, 7142857]
</pre>


=={{header|REXX}}==
=={{header|REXX}}==