约塞夫问题:

xiaoxiao2021-02-27  231

约塞夫问题:

从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); }

转载请注明原文地址: https://www.6miu.com/read-10482.html

最新回复(0)