这里更新指针法,真的每句都是坑
(寥寥数十句,句句都是坑)
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 }