golang 算法-约瑟夫环

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)
}

猜你喜欢

转载自blog.csdn.net/qq_36183935/article/details/80785825