?思路,定义一个标记数组,标记每个猴子的状态,出圈还是没出圈,然后创造一个死循环,让报数一直持续,然后直到只剩一只猴子
代码:
#include<stdio.h> int flag[1100]; ? ? //标记对应编号的猴子的状态,走还是没走 int main() { ? ? int n; ? ? int sum; ? ? scanf("%d",&n); ? ? sum=n; ? ? ? ? ? ? int ct=0,i=1; ? ? while(1) ? ? ? ? //死循环 ? ? { ? ? ? ? if(flag[i]==0) ?//这里可以跳过已经出圈的猴子 ? ? ? ? { ? ? ? ? ? ? ct++; ? ? ? ? ? ? if(ct==3) ? ? //报数 ? ? ? ? ? ? { ? ? ? ? ? ? ? ? flag[i]=1; ? ? ? ?//每出圈一个猴子就让总数sum-- ? ? ? ? ? ? ? ? sum--;? ? ? ? ? ? ? ? ? ct=0; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? i++; ? ? ? //达到相邻报数的效果,可以看成猴子按顺时针围起来,顺时针报数 ? ? ? ? if(i>n) ? ?//编号一直在1--n之间变化, ? ? ? ? ? ? i=i%n; ? ? ? ? if(sum==1) ? //剩一只猴子就跳出循环 ? ? ? ? ? ? break; ? ? } ? ? for(int i=1;i<=n;i++) ? ? ? ? if(flag[i]==0) ? ? ? //查找猴王的编号 ? ? ? ? ? printf("%d",i); } ?
|