题目链接
题目描述
有n青蛙围成一圈,顺序排号。从第1个青蛙开始报数(从1到3报数),凡报到3的青蛙退出圈子,问最后留下的青蛙是原来的第几号的那个青蛙。
输入
初始青蛙数n
输出
最后一青蛙的初始编号
样例输入
3
样例输出
2
题意:
约瑟夫环问题,在n个人里面数数,数到3的人自杀,然后从一开始数,输出最后一个自杀的人的编号。
解题思路:
本题难点就在于怎么重新开始数数,还有怎么让数到三的人自杀,用%来控制下标,也就是每个人的编号,用1和0来控制是否自杀。
代码详解:
#include<stdio.h>
int main()
{
int b[10000],j,i,n,x=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
b[i]=1;//值为1就是还活着;
}
j=0;
for(i=n;i>1;)
{
if(b[j]==1)
x++;//控制自杀的人;
if(x%3==0&&b[j]!=0)//每数到三的意思就是,是三的倍数就自杀;
{
b[j]=0;//b[i]=0的意思就是自杀,自杀以后,值变为0;
i--;
}
j=(j+1)%n;//控制下标为0~(n-1),然后一直循环;
}
for(i=0;i<n;i++)
{
if(b[i]==1)//找到没有自杀的那一个人的编号;
break;
}
printf("%d",i+1);
return 0;
}