From 56d6ccc17a39361ede9bf1a4d6810690b76cda2b Mon Sep 17 00:00:00 2001 From: Igor Pashev Date: Sun, 26 Jun 2011 14:15:39 +0400 Subject: Fortran 2003 --- gcd.f03 | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 gcd.f03 diff --git a/gcd.f03 b/gcd.f03 new file mode 100644 index 0000000..f1f144f --- /dev/null +++ b/gcd.f03 @@ -0,0 +1,57 @@ +! SYNOPSIS: +! +! # gfortran -o gcd-f gcd.f03 +! # ./gcd-f 11 22 33 121 +! + +program GCD +implicit none + +integer, allocatable :: ns(:) +integer :: i, n +character*20 :: tmpstr + +n = command_argument_count() + +allocate(ns(n)) ! allocate memory for numbers given in command line + +do i = 1, n + call get_command_argument(i, tmpstr) + ns(i) = str2int(tmpstr) +end do + +print *, gcdn(ns) + +deallocate(ns) + + +! If we declare functions first, +! we have to specify its types within +! the `program' section. +! See http://en.wikibooks.org/wiki/Fortran/Fortran_procedures_and_functions +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(:) ! n is an array + integer :: i + gcdn = n(1) + do i = 2, size(n) + gcdn = gcd2(gcdn, n(i)) + end do +end function + +end program -- cgit v1.2.3