猴子分香蕉(蓝桥杯题库)

文章描述了一道编程题,涉及逆向思维解决数学问题。题目中五只猴子依次醒来,每次将香蕉均分成5堆并吃掉剩余的香蕉,最后一只猴子能均分则初始香蕉数确定。通过循环和条件判断,从最后一个猴子开始向前推算,找到满足条件的初始香蕉数量。
摘要由CSDN通过智能技术生成

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

5 只猴子是好朋友,在海边的椰子树上睡着了。这期间,有商船把一大堆香蕉忘记在沙滩上离去。

第 1 只猴子醒来,把香蕉均分成 5 堆,还剩下 1 个,就吃掉并把自己的一份藏起来继续睡觉。

第 2 只猴子醒来,把香蕉均分成 5 堆,还剩下 2 个,就吃掉并把自己的一份藏起来继续睡觉。

第 3 只猴子醒来,把香蕉均分成 5 堆,还剩下 3 个,就吃掉并把自己的一份藏起来继续睡觉。

第 4 只猴子醒来,把香蕉均分成 5 堆,还剩下 4 个,就吃掉并把自己的一份藏起来继续睡觉。

第 5 猴子醒来,重新把香蕉均分成 5 堆,哈哈,正好不剩!

请计算一开始最少有多少个香蕉。

问题分析

这道题我们采用逆向思维来做,假设最后一次分堆分成的一堆为1个,如果运算中间的数据不符合就分成一堆2个以此类推,根据题干我们可以总结出显而易见的规律,除了最后一只猴子外,第i只猴子吃掉了i个香蕉,同时藏起了吃掉后的香蕉数量的1/5,所以我们先将1/5补全,再加上i个香蕉就是到第i只猴子手中的香蕉数目,以此类推至第一只猴子,我们就能直到一共有多少个香蕉,因为我们逆推时原始一堆的香蕉个数是从少到多,在第一次计算出符合要求的数据后我们就结束了,所以能够得到正确的数据。

代码实现

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int flag=0;
  double x;
  for(int m=1;flag==0;m++){//逆向推理第一步,找出最后一只猴子分出的香蕉数目
    x=(double)m;//转换成double类型,便于后面判断该数据是否合理
    for(int i=5;i>=1;i--){
      if(i!=5){
        if(x/4==(int)x/4){//第5只猴子之外的猴子都将香蕉数目变成吃掉后的4/5,所以我们要判断这一步中的x值是否合理
          x=x*5/4;
          x+=i;
          flag=1;
        }else{//不合理
          flag=0;
          break;
        }
      }else{
        x*=5;
      }
    }
  }
  printf("%.0lf",x);//打印数目
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值