Guest User

Untitled

a guest
Jun 29th, 2018
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. program circle
  2.   implicit none
  3.  
  4.   integer :: n, m
  5.  
  6.   write(*, '(a)', advance='no') 'enter n: '
  7.   read(*, *) n
  8.   write(*, '(a)', advance='no') 'enter m: '
  9.   read(*, *) m
  10.  
  11.   if (n > 0 .and. m > 0) then
  12.     call killem(n, m)
  13.   else
  14.     stop "invalid parameters"
  15.   end if
  16.  
  17. contains
  18.  
  19.   subroutine killem(n, m)
  20.     integer, intent(in) :: n, m
  21.     integer :: men(n), i
  22.     character(100) :: logfile, frmt
  23.    
  24.     ! enumerate the men
  25.     do i = 1,n
  26.       men(i) = i
  27.     end do
  28.  
  29.     ! open log file
  30.     write(logfile, '("log_n_",i0,"_m_",i0)') n, m
  31.     open(unit=10, file=logfile)
  32.  
  33.     ! write out parameters
  34.     write(10, '("n = ", i0, ", m = ", i0)') n, m
  35.  
  36.     ! count backwards from n downto 1; each step, the
  37.     ! first i men are still alive
  38.     do i = n, 1, -1
  39.       ! write out all men that are still alive
  40.       write(frmt, '("(",i0,"(i0,1x))")') i
  41.       write(10, frmt) men(1 : i)
  42.       ! move the first man to the back
  43.       call rotate(1, men(1 : i))
  44.       ! rotate the rest by m - 1, bringing the
  45.       ! next victim to the front
  46.       call rotate(m - 1, men(1 : i - 1))
  47.     end do
  48.  
  49.     close(10)
  50.   end subroutine
  51.  
  52.   ! rotate array a by m
  53.   recursive subroutine rotate(m, a)
  54.     integer, intent(in) :: m
  55.     integer, intent(inout) :: a(:)
  56.  
  57.     integer :: i, tmp, s
  58.  
  59.     s = size(a)
  60.  
  61.     ! nothing to do
  62.     if (m < 1 .or. s < 2) return
  63.  
  64.     if (m == 1) then ! base case
  65.       ! save first element
  66.       tmp = a(1)
  67.       ! shift left
  68.       a(1 : s - 1) = a(2 : s)
  69.       ! put first element to the back
  70.       a(s) = tmp
  71.     else
  72.       ! rotate m times by 1
  73.       ! not very efficient, but who cares
  74.       do i = 1, m
  75.         call rotate(1, a)
  76.       end do
  77.     end if
  78.   end subroutine
  79.  
  80. end program
Add Comment
Please, Sign In to add comment