作业帮 > 综合 > 作业

N只猴子选猴王问题,编程的fortran语言,

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/04/30 17:22:50
N只猴子选猴王问题,编程的fortran语言,
方法是,它们围成一圈,从1到M连续报数.凡是报到M时,报该数的猴子就从圈中退出,然后剩下的猴子接着(从退出圈中的猴子后边开始)从1到M报数,直到只剩下一个猴子时,该猴子就是猴王
上学期刚上过fortran,一样的题,貌似m,n换了个位置.
program exercise01
implicit none
integer m,n,err,i,temp,index,left,t,s,r
integer(2),allocatable:: a(:),b(:)
real(4) r1,r2,r3
character(1),allocatable:: name(:)
!n不能等于1,n在2到m间,m在3到14间
call random_seed()
call random_number(r1)
m=int(12*r1)+2
call random_number(r2)
n=int((m-3)*r2)+2
print *,'m=',m,'n=',n
print *
!确认可分配数组是否分配
allocate(name(m),stat=err)
if(err.ne.0) stop 'array allocation error'
allocate(a(m),stat=err)
if(err.ne.0) stop 'array allocation error'
allocate(b(m),stat=err)
if(err.ne.0) stop 'array allocation error'
a=(/1:m/)
!随机产生顺序,即随机产生相应于顺序的猴子名,用asc码表示
do i=m,1,-1
call random_number(r3)
temp=int((i-1)*r3)+1
name(m+1-i)=char(a(temp)+96)
a(temp:(m-1))=a((temp+1):m)
enddo
print *,'起始顺序:'
do i=1,m
write(*,'(a4$)') name(i)
enddo
print *
!报数过程,r为轮次,t为每轮剩余人数,s用于计数
r=0
do
r=r+1
t=s
s=0
print *
print *
write(*,'(a4,i4,a4)') '第',r,'轮'
if(r.eq.1) t=m
do i=1,t
if(mod(i,n).eq.0) then
s=s+1
name(s)=name(i)
write(*,'(a4$)') name(s)
endif
enddo
if(s.lt.n) exit
enddo
print *
print *
write(*,'(a8,a4)') '猴王为',name(1)
end program