rlm@0: program collatz rlm@0: implicit none rlm@0: character (len = 100) :: file_name rlm@0: integer, parameter :: big = selected_int_kind(11) rlm@0: integer :: n rlm@0: call getarg( 1, file_name ) rlm@0: OPEN(unit = 7, file = file_name) rlm@0: read (7,*) n rlm@0: write (unit = *, fmt = "(I0)") search_collatz(n) rlm@0: rlm@0: contains rlm@0: rlm@0: function collatz_next (n) result (r) rlm@0: implicit none rlm@0: integer (kind = big) :: r,n rlm@0: if (0 == mod(n,2)) then rlm@0: r = n/2 rlm@0: else rlm@0: r = 1 + 3*n rlm@0: end if rlm@0: end function collatz_next rlm@0: rlm@0: function collatz_length (n) result (r) rlm@0: implicit none rlm@0: integer (kind = big) :: t rlm@0: integer :: n,r rlm@0: r = 1 rlm@0: t = n rlm@0: do rlm@0: if (1 == t) then rlm@0: exit rlm@0: end if rlm@0: r = r + 1 rlm@0: t = collatz_next(t) rlm@0: end do rlm@0: end function collatz_length rlm@0: rlm@0: function search_collatz (n) result (r) rlm@0: implicit none rlm@0: integer n,r,i,max,max_val,temp_val rlm@0: integer (kind = big) :: t rlm@0: t = n rlm@0: do i = 1,n-1 rlm@0: temp_val = collatz_length(i) rlm@0: if (temp_val > max_val) then rlm@0: max = i rlm@0: max_val = temp_val rlm@0: end if rlm@0: end do rlm@0: r = max rlm@0: end function search_collatz rlm@0: end program collatz