1、一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
1、普通
func main(){
var n,find,count int //find=1找到下一个猴子让它出去,count计数是否数到3
fmt.Scan(&n)
num := 0 //当num到达N-1时,只剩一只猴子
flag :=[]int{} //flag[i],该猴子已经出去了
for i:=0;i<n;i++ {
flag = append(flag,0)
}
i := 0 //找下一只要出去的猴子从i开始找
for num != n-1 {
find = 0
count=0
for ;find==0;i++{
t := i%n
if flag[t] == 0 {
count+=1
}
if count==3 {
num ++
find=1
flag[t] = 1
}
}
}
fmt.Println(flag)
for i=0;i<n;i++ {
if flag[i] == 0{
fmt.Println(i)
}
}
}
/*结果
输入:11
输出:[1 1 1 1 1 1 0 1 1 1 1]
6
*/
2、递归:
https://blog.csdn.net/wusuopubupt/article/details/18214999
//n个人,每数到k就出圈
func josephus(n int,k int) int{
if n==1 {
return 0
}else {
return (josephus(n-1,k)+k)%n
}
}
func main(){
n:=11
k:=3
res:= josephus(n,k)
fmt.Println(res)
}