约瑟夫环问题【数组】
时间: 1ms 内存:128M
描述:
约瑟夫环问题:设有n个人围坐一圈,并按顺时针方向1—n编号。从第s个人开始进行报数,报数到第m个人,此人出圈,再从他的下一个人重新开始从1到m的报数进行下去 ,直到只剩一个人为业
输入:
人数n
从第s个人开始报数s
报到第几个数m
输出:
剩下的最后一个人的编号
示例输入:
9
1
3
示例输出:
1
提示:
参考答案(内存最优[748]):
#include<stdio.h>
#include<string.h>
int main()
{
int i,n,s,m,k,flag[100],s0;
scanf("%d%d%d",&n,&s,&m);
memset(flag,0,sizeof(flag));
k=0;
s0=n;
for(i=s;;i++)
{
if(i>n)
i=1;
if(flag[i]==0)
{
k++;
if(k==m)
{
flag[i]=1;
k=0;
s0--;
}
}
if(s0==1)
break;
}
for(i=1;i<=n;i++)
if(flag[i]==0)
printf("%d\n",i);
return 0;
}
参考答案(时间最优[0]):
#include<stdio.h>
#include<string.h>
int main()
{
int i,n,s,m,k,flag[100],s0;
scanf("%d%d%d",&n,&s,&m);
memset(flag,0,sizeof(flag));
k=0;
s0=n;
for(i=s;;i++)
{
if(i>n)
i=1;
if(flag[i]==0)
{
k++;
if(k==m)
{
flag[i]=1;
k=0;
s0--;
}
}
if(s0==1)
break;
}
for(i=1;i<=n;i++)
if(flag[i]==0)
printf("%d\n",i);
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。
