circle踢人(约瑟夫环) c++

这里更新指针法,真的每句都是坑

(寥寥数十句,句句都是坑)

 1 //
 2 // Created by snnnow on 2020/4/12.
 3 //question:转圈,一共N个人,数到M的出列,求最后一个人的编号
 4 //这个题学到了一种新的方法,用指针(用数组实现)
 5 //初始条件每一个数组存放的数是他的下一位数,如a[3]=4;那么a[a[j]]就是下一位的下一位
 6 //去掉人以后,只需要把这个人的上一个指向它的指针换成这个人所指向的指针(也就是说,没人指向它,它就没有了)
 7 
 8 //注意一个问题:不要把初始的n改变掉(你应改另设一个初始值为N的数,作为计数器)
 9 
10 #include <iostream>
11 using  namespace std;
12 int main(){
13     int n,m;
14     cin >> n >> m;
15     int j = n;
16     int k = 1;
17     int p = 0;
18     int ans[10010];
19     for (int i = 1; i < n; ++i) {//注意是从一开始的
20         ans[i] = i + 1;//赋值到下一位
21 
22     }
23     ans[n] = 1;//注意第一个
24 
25     while(p < n){
26         while(k < m){//这个地方要注意,这里只循环了n-1次,循环的最后一次在下面
27             j = ans[j];//指针在移动啊~就相当于j在一直加
28             k++;
29         }
30         cout<<ans[j]<<" ";//这里相当于循环的最后一次(ans[j]可以看做j的下一位啊)
31         p++;
32         ans[j] = ans[ans[j]];
33         k = 1;
34     }
35     //小白菜曾尝试改代码,但是这样做是不对的
36     //因为不要忘了ans[j-1]...说不定j-1=0就凉了
37 //    while(p < n){
38 //        while(k <= m){
39 //            j = ans[j];
40 //            k++;
41 //        }
42 //        cout<<j<<" ";
43 //        p++;
44 //        ans[j-1] = ans[j];
45 //        k = 1;
46 //    }
47 
48 }
原文地址:https://www.cnblogs.com/zhmlzhml/p/12689537.html