樣例輸入3 輸出2
輸入100 輸出91
代碼及分析:
#include<stdio.h>
int main()
{
int i,n,N,out,a[1000];
out=i=n=0; //用out記錄退出圈子的人,初始化0;
printf("輸入約瑟夫圈大小");
scanf("%d",&N);
for(i=0;i<N;i++) //用N個數的數組保持N個人,並講該數組全部初始化1,用以記錄第N-1個人在圈外還是圈內(1則圈內,0則圈外);
{
a[i]=1;
}
i=0;
while(out!=N-1) //利用while循環找到剩下的人的編號;直到出圈的人=N-1時候停止;
{
if(a[i]==1) //由於a[i]=1表示在圈內,則只要有a[i]==1,並令n++,記錄下他報的數;
{
n++;
}
if(n==3) //由於報到3即出圈,后繼續從1開始報;由於只要報到n=3,則該人即出圈,則用out++來記錄出圈的人數;並且將該人所在a[i]從1 改為0,表示該人已經出圈,下一次循環時該人不參與報數;
{
a[i]=0;n=0;out++;
}
i++;
if(i==N) //由於N個人圍成了一個圈,則如果報到了第N個人,則下一個人為編號1,則賦值i=0;繼續下一次查找;
{
i=0;
}
}
for(i=0;i<N;i++) //由於出圈的人都已經被重新賦值0;則只要找到a[i]=1的人,則該人為剩下的人;
if(a[i]==1)
{
printf("最后剩下的是第%d個人",i+1);break;
}
return 0;
}