C++ 约瑟夫环的实例代码

时间:2021-07-18 00:38:15

C++ 约瑟夫环的实例代码

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

分析:有n个人,要想所有的人都退出去,只有每个人喊到m,才可以退完,所以可以算出,n*m为所有人总共报数的总次数。

代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/*
 *   约瑟夫出圈
 */
#include <stdio.h>
 
int main()
{
  char peo[100] ;
  char *p_peo = peo;
  int i , n , skip , flag[100] = {0} , cnt;
  int *p_flag = NULL;
  printf("请输入人数:");
  scanf("%d", &n);
  printf("所有人如下:\n");
  for(p_peo , i = 0 ; p_peo < peo + n ; ++p_peo , ++i)
  {
    *p_peo = 'a' + i;
    printf("%c ", *p_peo);
  }
  printf("\n");
 
  printf("请输入报数值:");
  scanf("%d", &skip);
 
  cnt = 0;
  while(cnt <= n * skip)
  {
    for(p_peo = peo , p_flag = flag ; p_peo < peo + n ; ++p_peo , ++p_flag)
    {
      if(*p_flag)
        continue;
 
      cnt++;
      if(!(cnt % skip))
      {
        *p_flag = 1;
        printf("%c ", *p_peo);
      }
    }
  }
  printf("\n");
  return 0;
}

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

原文链接:http://blog.csdn.net/q_l_s/article/details/22893975