约瑟夫环

136 阅读1分钟
package main  
  
import "fmt"  
  
// 最后剩下的人  
// 编号是 1~ n,每次数m,数到m删除  
func josephus(n, m int) int {  
    p := 0  
    for i := 1; i <= n; i++ {  
        p = (p + m) % i  
    }  
    return p + 1  
}  
  
// 依次输出删除的人  
func josephus2(n, m int) {  
    res := make([]int, n+1)  
    cnt := 0 // 删除的个数  
    k := 0 // 计数,每次到m就开始删除  
    i := 0 // 编号  
  
    for cnt != n {  
        i++  
        if i > n {  
            i = 1 // 循环  
        }  
        if res[i] == 0 {  
            k++  
            if k == m {  
                res[i] = 1  
                cnt++  
                k = 0  
                fmt.Printf("%d ", i)  
            }  
        }  
    }  
}  
  
func main() {  
    res := josephus(10, 3)  
    fmt.Println(res)  
}