约塞夫问题:
从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); }
