约瑟夫环问题【数组】

约瑟夫环问题【数组】

时间: 1ms        内存:128M

描述:

 约瑟夫环问题:设有n个人围坐一圈,并按顺时针方向1n编号。从第s个人开始进行报数,报数到第m个人,此人出圈,再从他的下一个人重新开始从1m的报数进行下去 ,直到只剩一个人为业

输入:

人数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;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注