洛谷 P1996 约瑟夫问题

题目描述
n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。

输入格式
输入两个整数 n,m。

输出格式
输出一行 n 个整数,按顺序输出每个出圈人的编号。

洛谷 P1996 约瑟夫问题_第1张图片

参考代码 

#include
using namespace std;    
int main(){ 
    int n,m;
     int a[1000]={0};  
    int f=0,t=0,s=0;     
     cin>>n>>m;                                       
        do {
            t++; 
             if (t==n+1) t=1;    
             if (a[t]==0) ++s;    
             if (s==m) {
                 s=0;        
             cout<               a[t]=1;        
                 f++;         
             }
           } while(f!=n);        
         return 0;
     }

代码解读

do {
            t++; 
             if (t==n+1) t=1;    
             if (a[t]==0) ++s;    
             if (s==m) {
                 s=0;        
             cout<               a[t]=1;        
                 f++;         
             }
           } while(f!=n);        
         return 0;
     }

-->do-while循环,t先等于t加1,如果现在t=n+1,那么t就等于1;

如果现在的数对a[t]等于0,s等于s加1;

如果s等于m,s变回0;

输出t;

a[t]等于1;

f等于f加1;

同时如果现在的f不等于n,结束当前循环.

你可能感兴趣的:(算法,c++,c语言)