Mercurial > coderloop
annotate src/collatz.f @ 0:307a81e46071 tip
initial committ
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Tue, 18 Oct 2011 01:17:49 -0700 |
parents | |
children |
rev | line source |
---|---|
rlm@0 | 1 program collatz |
rlm@0 | 2 implicit none |
rlm@0 | 3 character (len = 100) :: file_name |
rlm@0 | 4 integer, parameter :: big = selected_int_kind(11) |
rlm@0 | 5 integer :: n |
rlm@0 | 6 call getarg( 1, file_name ) |
rlm@0 | 7 OPEN(unit = 7, file = file_name) |
rlm@0 | 8 read (7,*) n |
rlm@0 | 9 write (unit = *, fmt = "(I0)") search_collatz(n) |
rlm@0 | 10 |
rlm@0 | 11 contains |
rlm@0 | 12 |
rlm@0 | 13 function collatz_next (n) result (r) |
rlm@0 | 14 implicit none |
rlm@0 | 15 integer (kind = big) :: r,n |
rlm@0 | 16 if (0 == mod(n,2)) then |
rlm@0 | 17 r = n/2 |
rlm@0 | 18 else |
rlm@0 | 19 r = 1 + 3*n |
rlm@0 | 20 end if |
rlm@0 | 21 end function collatz_next |
rlm@0 | 22 |
rlm@0 | 23 function collatz_length (n) result (r) |
rlm@0 | 24 implicit none |
rlm@0 | 25 integer (kind = big) :: t |
rlm@0 | 26 integer :: n,r |
rlm@0 | 27 r = 1 |
rlm@0 | 28 t = n |
rlm@0 | 29 do |
rlm@0 | 30 if (1 == t) then |
rlm@0 | 31 exit |
rlm@0 | 32 end if |
rlm@0 | 33 r = r + 1 |
rlm@0 | 34 t = collatz_next(t) |
rlm@0 | 35 end do |
rlm@0 | 36 end function collatz_length |
rlm@0 | 37 |
rlm@0 | 38 function search_collatz (n) result (r) |
rlm@0 | 39 implicit none |
rlm@0 | 40 integer n,r,i,max,max_val,temp_val |
rlm@0 | 41 integer (kind = big) :: t |
rlm@0 | 42 t = n |
rlm@0 | 43 do i = 1,n-1 |
rlm@0 | 44 temp_val = collatz_length(i) |
rlm@0 | 45 if (temp_val > max_val) then |
rlm@0 | 46 max = i |
rlm@0 | 47 max_val = temp_val |
rlm@0 | 48 end if |
rlm@0 | 49 end do |
rlm@0 | 50 r = max |
rlm@0 | 51 end function search_collatz |
rlm@0 | 52 end program collatz |