趣味问题 约瑟夫圈的数组求解方法

 假设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就踢并且清零。因为下标不变,最后找序号就可以了。





猜你喜欢

转载自blog.csdn.net/rocky_56x/article/details/79239084