约塞夫问题:
从1到n开始编号,数到m的人自动退出,直到最后一个人。求出最后一个人的编号。
1.这个人太厉害了,直接推出公式。
注意:他是输出每次被筛选出来的人的编号,最后一个才是自己想要的。
#include <stdio.h>
#include <conio.h>
int main( void )
{
int n, i = 0, m, p;
scanf("%d%d", &n, &m); //n总人数,m步长
while( ++i <= n )
{
p = i * m;
while (p > n)
p = p - n + (p - n - 1)/(m - 1);
printf("%d\n", p);
}
getch();return 0;
}
2.这个用k来表示每次查数的人的位置编号,用hou来控制每次查的猴子数目为n,然后每次选出一个猴子筛选出去,最后剩的就是最后的想要的猴子。
#include<stdio.h>
int main()
{
int m,n,k;
while(scanf("%d%d",&m,&n),m!=0||n!=0)
{ int biao[100];
for(int i=0;i<m;i++)
{
biao[i]=i+1;
}
k=0;
for(int i=0;i<m;i++)
{
int hou=0;
while(hou<n)
{
while(biao[k]==0)
{
k=(k+1)%m;
}
hou++;
k=(k+1)%m;
}
k--;
if(k<0)
k=m-1;
if(i==m-1)
printf("%d\n",biao[k]);
biao[k]=0;
}
}
}
3.这个方法更简单。
#include <stdio.h>
int main()
{
int n, m, i, s=0;
printf ("N M = "); scanf("%d%d", &n, &m);
for (i=2; i<=n; i++)
s=(s+m)%i;
printf ("The winner is %d\n", s+1);
}