summaryrefslogtreecommitdiff
path: root/gcd.f90
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2022-09-20 20:36:13 +0200
committerIgor Pashev <pashev.igor@gmail.com>2022-09-20 20:37:16 +0200
commitb70d57b1bb12cfb5b5923537cc1615fd268aecd9 (patch)
tree77bbf62aaa8a099a0f1866d47705ef192f443b80 /gcd.f90
parent7e77b68f6879917a27a0fa3426b9ceef242a9879 (diff)
downloadgcd-b70d57b1bb12cfb5b5923537cc1615fd268aecd9.tar.gz
Update Fortran
Diffstat (limited to 'gcd.f90')
-rw-r--r--gcd.f9052
1 files changed, 52 insertions, 0 deletions
diff --git a/gcd.f90 b/gcd.f90
new file mode 100644
index 0000000..c17c61c
--- /dev/null
+++ b/gcd.f90
@@ -0,0 +1,52 @@
+! SYNOPSIS:
+!
+! # gfortran -o gcd-f gcd.f90
+! # ./gcd-f 11 22 33 121
+!
+
+program GCD
+ implicit none
+
+ integer, allocatable :: ns(:)
+ integer :: i, n
+ character(len=20) :: tmpstr
+
+ n = command_argument_count()
+
+ allocate (ns(n))
+
+ do i = 1, n
+ call get_command_argument(i, tmpstr)
+ ns(i) = str2int(tmpstr)
+ end do
+
+ print '(I0)', gcdn(ns)
+
+ deallocate (ns)
+
+contains
+
+ pure integer function str2int(s)
+ character*(*), intent(in) :: s
+ read (s, *) str2int
+ end function
+
+ pure recursive integer function gcd2(a, b) result(GCD)
+ integer, intent(in) :: a, b
+ if (b == 0) then
+ GCD = a
+ else
+ GCD = gcd2(b, mod(a, b))
+ end if
+ end function gcd2
+
+ pure integer function gcdn(n)
+ integer, intent(in) :: n(:)
+ integer :: i
+ gcdn = n(1)
+ do i = 2, size(n)
+ gcdn = gcd2(gcdn, n(i))
+ end do
+ end function
+
+end program