【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サイクルを用いて実現した.
今、私たちはこの問題を変えて、今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; //
}
}
}
}