今天来说一下约瑟夫问题
有n个人即将被强盗抓住,强盗打劫完后,不忍心杀掉所有人,想放掉一个人,但人人都想活,于是强盗想出了一种杀人的方法,让被抓住的n个人围成一圈,由第1个人报数,每报到第每m个人时,他就会被杀掉,直到剩下最后一个人,放掉,问站在什么位置可以避免死亡。
输入:6 2
输出:5
#include<stdio.h>
int main()
{
int n,m;
printf("请输入总人数n和第m个人被杀:");
scanf("%d %d",&n,&m);
int a[n+1],i;
/*因为习惯从1开始计数,
所以申请的数组长度是n+1,
当然也可以从0开始,
最后+1即可*/
for(i=1;i<=n;i++)
{
a[i]=0;
}
/*先将数组中的数都赋值为0,谁被杀就变1*/
int count=0,num=n;
i=1;
while(1)
{
if(a[i]==0)/*只有0才代表活着,才能被计数*/
{
count++;
}
if(a[i]==0&&count%m==0)
{
a[i]=1;
num--;
}
if(num==1)
{
break;
}
i++;
if(i>n)/*当号码超过了实际的最大值,就从1重新开始*/
{
i=1;
}
}
for(i=1;i<=n;i++)
{
if(a[i]==0)
{
printf("%d号可以存活\n",i);
}
}
return 0;
}
当然约瑟夫问题的解决还有很多种方法,比如链表,有兴趣的可以试试。