约瑟夫问题(也叫丢手帕问题)不涉及很多算法,但却是一个很好的逻辑训练题!也是ACM训练OJ上的一道题(http://acm.nyist.net/JudgeOnline/problem.php?pid=278)。
我用数组模拟做了一下:
//丢手帕问题 约瑟夫问题
#include<stdio.h>
#include<string.h>
int main()
{
int i,n,n1,begin,begin1,num,num1;
scanf("%d%d%d",&n,&begin,&num);
n1=n;//人数
begin1=begin-1;//开始位置,注意数组下标和实际位置的差别
num1=num;//计数
int a[n];
memset(a,0,sizeof(int)*n);
printf("剩余个数\t位置\n");
while(n1>=1)
{
i=begin1;//新的开始位置
num1=0;//重置计数
while(1)//找到要删除的位置
{
if(a[i]==0)
num1++;
if(num1==num)//这样跳出时正好是要出列的位置
break;
i=(i+1)%n;//循环
}
a[i]=1;//置1 出列
while(a[i]==1)//找下一个开始的位置
i=(i+1)%n;//注意死循环
begin1=