Advertisement
RUNQ_W

约瑟夫环问题 C++ 求阐释

Nov 17th, 2023
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.45 KB | Source Code | 0 0
  1. 约瑟夫环问题
  2. 出处 educoder作业 指针
  3. 您好!我对这个问题GitHub上的一个答案不太理解,请您指导,谢谢!(问题在代码旁批中)
  4. 原网址为: https://github.com/905355494/SJTU-Awesome-TA-CPP/blob/master/educoder-tasks/task-chp7.md
  5. ### 任务描述
  6.  
  7. n个人围成一圈,按顺序从1到n编号。从第一个人开始报数123,报到3的人退出圈子,下一个人从1开始重新报数,报到3的人退出圈子。如此进行下去,直到留下最后一个人。当给定一个正整数n时,请问留下来的人的编号是多少?
  8.  
  9. ### 输入输出示例
  10.  
  11. input:`4`
  12. output:`1`
  13.  
  14. ### 代码样例
  15.  
  16. #include <iostream>
  17. using namespace std;
  18.  
  19. int main()
  20. {    
  21.     int n;
  22.     cin>>n;
  23.     int *arr = new int[n];
  24.     int *p = arr;
  25.     int c=0;
  26.     for(int i=0; i<n; i++)arr[i]=1;
  27.     int j=n-1;
  28.     while(j--){
  29.         for(int i=0; i<2; i++){                             //请问这里为什么这边要执行两次?是与约瑟夫环的3有关吗?
  30.             while(*p==0){p++;c++;if(c==n){p=arr;c=0;}}      //请问这一句是什么意思?
  31.             {p++;c++;if(c==n){p=arr;c=0;}}                  //此句反复出现,在不同位置有何作用?
  32.         }
  33.         while(*p==0){p++;c++;if(c==n){p=arr;c=0;}}
  34.         *p=0;
  35.         {p++;c++;if(c==n){p=arr;c=0;}}
  36.     }
  37.     for(int i=0; i<n; i++){
  38.         if(arr[i]==1){cout<<i+1;break;}
  39.     }
  40.     delete arr;
  41.  
  42.     return 0;
  43. }
Tags: C++
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement