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

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

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

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/341809

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午1:16
下一篇 2023年3月2日 上午1:16

相关推荐