题目描述
约瑟夫环问题:设有 n 个人围坐一圈,并按顺时针方向 1−n 编号。从第 s个人开始进行报数,报数到第 m 个人,此人出圈,再从他的下一个人重新开始从 1 到 m的报数进行下去 ,直到只剩一个人为止。
输入
人数 n;
从第 s 个人开始报数 ;
报到第几个数 m。
三个变量一个占一行。
输出
剩下的最后一个人的编号。
#include <stdio.h>
int main()
{
int n,i,j,s,m,t;
scanf("%d\n%d\n%d",&n,&s,&m);//一共n个人,从第s个人开始数,一次数m个,到第m个人时将其踢出
t = n;//剩余人数
int code[100];
for(i=0;i<n;i++)
{
code[i]=1;//将在场的记作1;不在场记作0
}
i = s-1;
while(t!=1)//当剩下一人时
{
j=1;//刷新j
while(j<m)//数人数,用j数
{
if(code[i]==0)
{
while(code[i]==0)//如果为0;则跳过直至下一个为1的位置
{
i++;
if(i>n-1)//如果i到达最后一个位置,则加一时跳到0位置处
{
i = 0;
}
}
}
i++;//进入下一位置
if(i>n-1)
{
i = 0;
}
j++;//计数器加一
}
if(code[i]==0)
{
while(code[i]==0)
{
i++;
if(i>n-1)
{
i = 0;
}
}
}//如果要踢出人的位置上已经缺席,则到下一个非零位置并将其剔除
code[i]=0;
i++;
t--;
if(i>n-1)
{
i = 0;
}
}
for(i =0;i<n;i++)//找到最后1个人,打印位置
{
if(code[i]==1)
{
printf("%d",i+1);
break;
}
}
return 0;
}