C语言--五猴分桃

题目

5只猴子一 起摘了1堆桃子。因为太累了,它们商量决定,先睡一 觉再分。过了不知多久,1只猴子来了。它见别的猴子没来,便将这1堆桃子平均分成5份,结果多了1个,就将多的这个吃了,拿走其中的1堆。又过了不知多久,第2只猴子来了。它不知道有1个同伴已经来过,还以为自己是第1个到的呢。于是将地上的桃子堆起来,平均分成5份,发现也多了1个,同样吃了这1个,拿走其中的1堆。第3只、第4只、第5只猴子都是这样…问这5只猴子至少摘了多少个桃子?第5个猴子走后还剩下多少个桃子?

输出5只猴子至少摘了多少个桃子,第5个猴子走后还剩下多少个桃子。中间用空格隔开。
Sample Input
Sample Output
3121 1020

分析

我们由题目可以知道,每一只猴子去的时候,桃子都是5的倍数加1。同时我们也可以知道,当第一只猴子吃掉一个并拿走五份中的一份,剩下的桃子便是4的倍数。抓住四的倍数这一个点,我们就可以从第五只猴子剩下的桃子来逆推总桃子数。定义最后剩下的桃子数为t,t一定为整数且为4的倍数。那么我们就可以从t=4开始计算。假设第5只猴子来时看到的桃子数为c,t/4是一份桃子的数量,乘5再加1,便是第五只猴子来的时候看到的桃子数,即c=(t/4)*5+1,此时的c为第四只猴子剩下的四份,也是4的倍数。若此时算出来的c不是4的倍数,说明初始的t不对,即需要在t=4的基础上再加4,继续计算第五只猴子来时看到的桃子数,并判断它是否为4的倍数,如果是4的倍数,再去计算第四只猴子看到的桃子数并判断其是否为4的倍数。以此类推,计算出第五只,第四只,第三只,第二只猴子看到的桃子数,并保证它们都是4的倍数。此时要注意,第一只猴子看到的桃子数不需要为4的倍数。

参考代码

 int t;//t为最后剩下的桃子数
    for(t=4;;t=t+4)//最后剩下的桃子数一定为4的倍数
    {
        int s;
        s=t;
        int i;//i为循环变量
        for(i=1;i<=4;i++)
        {
            int s1;//s和s1用于计算第五只到第二只猴子看到的桃子数
	    s1=s*5/4+1;
            if(s1%4!=0)break;//第五只到第二只猴子看到的桃子数一定为4的倍数
            s=s1;
        }
        if(i>4){printf("%d %d",s*5/4+1,t);break;}//第一只猴子看到的桃子数不需要是4的倍数。t为剩下的桃子数,s为第二只猴子看到的桃子数,那么s*5/4+1为第一只猴子看到的桃子数。

总结

本题需要抓住剩下的桃子是四份,即为4的倍数这个关键,计算出同为4的倍数的第五只到第二只猴子看到的桃子数,再计算出第一只猴子看到的桃子数即可。

  • 11
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值