这里使用数组模拟循环链表
#include
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;
}
原文:http://blog.csdn.net/u012965373/article/details/44184625