假设n个人围成一个圈,从1开始报数,到3就把报数的人踢出,然后从1开始,一直循环下去,直到最后一个人,请问这个 人是第几号人?
这就是约瑟夫圈问题,这个问题的求解方法比较多,今天介绍一下它的数组求解方法。
1#include<stdio.h>
2 int main()
3 {
4 int num = 0,out = 0,i = 0,n; //num为报号,到3清零;out是踢出的人数;i为数组下标;n是总人数
5 printf("please input\n");
6 scanf("%d",&n);
7 int a[1000] = {0};
8
9 for(i = 0;i < n;i++) //数组元素统一为1;
10 {
11 a[i] = 1;
12 }
13 i = 0;
14 while(out != (n - 1)) //只要剩下的人不是一个就继续循环;
15 {
16 if(a[i] != 0) //踢出的人设为0,不参加计算;
17 {num++;}
18 if(num >= 3) //报数到3就清零num,继续下一轮,同时把这个报号的人设为0;out加一
19 {
20 num = 0;
21 a[i] = 0;
22 out++;
23 }
24 i++; //下标加一,到下一个人;
25 if(i >= n) //如果报数到最后一个了,就结束重新报数;
26 {i = 0;}
27 }
28 for(i = 0;i < n;i++) //循环,判断第几号是1,为1就是该元素胜利了;
29 {
30 if(a[i] == 1)
31 {
32 printf("last is %d\n",i + 1);
33 break;
34 }
35 }
36 }
本题的关键就是如何判断是否该踢出,这个大家往往第一个都是想到用下标取余判断,但是随着踢出的人加多,会越来越困难。所以我就把先定义了一个num,到3就踢并且清零。因为下标不变,最后找序号就可以了。