样例输入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;
}