C语言实现猴子选大王(约瑟夫问题)



这里使用数组模拟循环链表

#include <stdio.h>
int main()
{
 int leftCount = 15;  //剩余猴子的数量
 int countNum = 0;   //目前数到了第几个
 int index = 0;      //定义当前数组的下标从0开始。
 int number = 7;   //数到第七个猴子就退出
 int a[15];    //一共15个猴子
 int k, i;    
 //先初始化,让所有的都为1
 for(i = 0; i < 15; i++)
 {
  a[i] = 1;
 }

 //然后每踢出去一个就在剩下的总数里减一,
 //那么当剩下的总数是一的时候,
 //那么就说明找到了已经找到了大王
 while(leftCount != 1)
 {
   //当元素是1的时候就进行计数,
   //当这个数量达到7的时候就说明,该把第七个踢出去了
   if(a[index] == 1)
   {
    
    //如果当前剩余猴子的数量大于1,
    //然后标记还为1,那么就在计数器中加1
    countNum++;
    
    //计数器的数和设定被踢出的猴子的数目相同的时候,
    //踢出猴子,把标记改为0
    if(countNum == 7){
     countNum = 0;           //刷新计数器,初始化为0
     a[index] = 0;           //改变当前的标记为0
     leftCount--;    //在剩余的猴子里面减一
    }
   }
  
   //每次判断完一个元素,数组的下标就加一
   index ++;  
   //当判断到数组的末尾的时候,这里模拟循环链表,
   //链表的尾部,接着头部,那么这里数组的尾部,就接着头部
   //就把数组的最后面的元素的后一个元素的下标变为0,
   //也就是又回到了第一个元素
   if(index == 15){
    index = 0;
  }
 }


 //到此为止已经找到了大王,
 //那么只有元素为1的猴子才是大王。
 //那么就循环查找那个是1?
 for(k = 0; k < 15; k++)
 {
   if(a[k] == 1){
    printf("%d", k + 1);
   }
 }
 return 0;
}


你可能感兴趣的:(C语言实现猴子选大王(约瑟夫问题))