猴子选大王

在UOJ的第一页,我只有一道尘封了100 年的题,至今未 AC原因只是一个小小的错误


题目:
n只猴子选大王,选举办法如下:从头到尾1,2,3报数,凡报3的退出,余下猴子第二轮从尾到头1,2,3报数,凡报3的退出...如此类推,当剩下两只猴子时,取这时报1的为王,若想当猴王,请问当初应占据什么位置?

一道很纯朴的代码片:
至于讲解注释里面都有吧

#include<bits/stdc++.h>    
using namespace std;    
bool a[1000];    
int main()    
{    
    int n;    
    cin>>n;    
    for (int i=0;i<1000;i++)    
      a[i]=true;//判断猴子是否被踢出队伍     
    bool k=true;//是否逆序     
    int x=n;    
    int count=0;//计数器     
    while (n>2)    
      {    
        count=0;    
        if (k)//顺序报数     
            for (int i=0;i<x;i++)    
              {    
                if (a[i])//没被踢出队伍     
                {    
                    count++;//报数     
                      if (count==3)//报到3     
                        {    
                            count=0;//归零     
                            a[i]=false;//踢出队伍     
                            n--;//队伍少一人     
                            if (n==2) break;//只剩两猴     
                        }    
                }    
              }    
        else    
          for (int i=x-1;i>=0;i--)//逆序报数     
              {    
                if (a[i])//没被踢出队伍     
                {    
                    count++;//报数     
                      if (count==3)//报到3     
                        {    
                            count=0;//归零     
                            a[i]=false;//踢出队伍    
                            n--;//队伍少一人     
                            if (n==2) break;//只剩两猴    
                        }    
                }    
              }    
        if (k)    
          k=false;//顺序变逆序     
        else    
          k=true;//逆序变顺序     
      }    
    return 0;    
}  

以前在Pascal上做过,第一次码的很快,满心欢喜地运行,带来的却是无输出

有一些数能输出,可都是错误答案
于是开始了漫长的搜索之旅……
终于,我发现了一个很小很小的错误
是很小,应该算是低级错误,其实也不用说的那么惊天动地的

首先是这个错误代码

原因是if后面没有用大括号拦截,程序自动把最近的else连在一起了
而不是和if(k)连在一起!

if (k)    
      for (int i=0;i<x;i++)    
        if (a[i])//找到第一个报数的猴子 注意!   
          {    
            cout<<i+1<<endl;//输出     
            return 0;//结束     
          }    
    else  //注意!  
      for (int i=x-1;i>=0;i--)    
        if (a[i])//找到第一个报数的猴子     
          {    
            cout<<i+1<<endl;//输出     
            return 0;//结束     
          }    

添上就能AC了

if (k)    
      for (int i=0;i<x;i++)    
      {
        if (a[i])//找到第一个报数的猴子 注意!   
          {    
            cout<<i+1<<endl;//输出     
            return 0;//结束     
          }
      }    
    else  //注意!  
      for (int i=x-1;i>=0;i--)    
        if (a[i])//找到第一个报数的猴子     
          {    
            cout<<i+1<<endl;//输出     
            return 0;//结束     
          }    
        

博客结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值