【C言語】初心者必修:ジョセフリング【配列+ループ】


Description:ローマ人がジョタパットを占領した後、39人のユダヤ人とJosephusと彼の友达は穴の中に隠れて、39人のユダヤ人は死んでも敵に捕まえられないことを決定して、そこで1つの自殺の方式を決定して、41人は1つの円に並んで、1人目から数え始めて、3人目まで数えてその人は自殺しなければならなくて、それから更に次から数え直さなければなりません.全員が自殺するまで.(死亡した人はリングから消え、例えば3日に自殺すると、再び2日に報告されると、3日をスキップし、4日に報告を続けます)
今、私たちはこの問題を変えて、今n人(最大1000人を超えない)がいて、番号は1からnで、彼らは1番から数え始めて、数えてmに報告した人が自殺したとします(Mは10を超えません)最後の自殺した人は誰ですか?
Input 1行、2つの整数、nとm、それぞれ人数と番号です
Output一行、一つの数、最後に死んだ人の番号
Sample Input 5 3 Sample Output 4 Hintは5人が3に報告した人が自殺したと仮定し、彼らの自殺順は3 1 5 2 4なので出力は4
考え方:ループ+配列シミュレーションこの過程、死亡した人はマークして、後でアクセスする時すべてスキップします
問題解:分析:難点は、1ラウンドを数えた後、どのように冒頭に戻るかです.ここではwhileサイクルを用いて実現した.
#include 
#include
int main() {
     
    int n,m;
    int count=0;//      
    int num=0;//        (    )
    scanf("%d %d",&n,&m);
    int a[1002];
    for(int i=1;i<=n;i++)
    {
     
        a[i]=1;//       1,    
    }
    while(count<n)//          ,    
    {
     
    for(int i=1;i<=n;i++)
    {
     //              
        if(a[i]==1)//    ,     
        num++;
        if(num==m){
     //       m 
            a[i]=0;//     0,    
            count++;//      
            num=0;//       
        }
        if(count==n)//        
        {
     
          printf("%d",i);//      
          break;  //    
        }
    }
    }
}