【编程题 】猴子分桃 (详细注释 易懂)

题目描述

 题目链接:猴子分桃__牛客网

老猴子辛苦了一辈子,给那群小猴子们留下了一笔巨大的财富——一大堆桃子。老猴子决定把这些桃子分给小猴子。
第一个猴子来了,它把桃子分成五堆,五堆一样多,但还多出一个。它把剩下的一个留给老猴子,自己拿走其中的一堆。
第二个猴子来了,它把桃子分成五堆,五堆一样多,但又多出一个。它把多出的一个留给老猴子,自己拿走其中的一堆。
后来的小猴子都如此照办。最后剩下的桃子全部留给老猴子。
这里有n只小猴子,请你写个程序计算一下在开始时至少有多少个桃子,以及最后老猴子最少能得到几个桃子。

输入描述:

输入包括多组测试数据。
每组测试数据包括一个整数n(1≤n≤20)。
输入以0结束,该行不做处理。

输出描述:

每组测试数据对应一行输出。
包括两个整数a,b。
分别代表开始时最小需要的桃子数,和结束后老猴子最少能得到的桃子数。

示例1

输入

5
1
0

输出

3121 1025
1 1

题意理解:

   这道题,其实不太好理解,因为要用数学公式去推算,而不是写几个数就容易理解。老猴子给小猴子分桃,但这个工作由小猴子来做,小猴子们比较孝顺,每一只分完 5堆,都会多出一个 给老猴子,并且每一只小猴子都是从上一堆的 五分之四 - 1的桃子里,再分为5堆,然后拿出一个给老猴子,一直到所有小猴子都分完,剩下的都是老猴子的。它要问的是,你倒推一下,一开始最少要有多少个桃子,能够被不断分5次。

解题思想: 

   既然每次分完都要剩一个,下一个猴子要分的时候要先减1,再分五堆,这样势必很麻烦,所以为了方便,我们就假设最初有x个桃子,我们借给猴子4个,则此时有x+4个,

 *   第一个猴子得到(x+4)/5,剩余(x+4)*(4/5)个

 *   第二个猴子分完后剩余(x+4)*(4/5)^2个

 *   第三个猴子分完后剩余(x+4)*(4/5)^3个

 *   依次类推,最后一个猴子分完后剩余(x+4)*( 4/5 )^n 

   好了,公式推完了,但应该还是不理解,为什么要 借给小猴子们4个苹果,我们这样说,小猴子每次要给老猴子分一个苹果,这是为什么? 因为单了一个,那它不想多分一个吗? 当然想啊,怎么办,我们给它加 4个,凑成 5的倍数,这样它不就可以多拿一个了,这不是很开心。 还是举例说明, 一开始有 121个苹果,第一个猴子分 120/5 = 24,剩余 96个,第二个猴子 分 95/5 = 19 ,剩余 76个,第三个猴子 分 75 / 5 = 15个,剩余 60个,但前面三个猴子还分别孝顺了一个,所以最终老猴子有 63个。   

    而如果一开始 我就借给猴子们4个苹果,也就是老猴子不要它们孝顺的那一个苹果,那第一个猴子分 125/5= 25个,剩余 100个,第二个猴子分 100/5 = 20个,剩余 80个,第三个猴子分 80/5 = 16个,剩余 64个,但老猴子借出去了4个,拿回了3个,所以最终老猴子拿到的苹果数是 64-4+3 = 63个 。我们发现由于一开始给凑够了 5的整数,那之后猴子们分的全是整数,分完之后,剩余 64个,但你给出去了四个,猴子们又还你n个,所以最后还是63个。 

    那为什么,每个小猴子多拿了一个,最后老猴子的个数还不受影响呢?因为每一个小猴子多拿一个的同时,它分的每一堆也多了一个,剩余的每一堆也多了一个,这样分到最后,老猴子就从剩余堆里 多拿了n 个,可是一开始它少了 4个,所以最后 分完剩余的苹果数 要 +n - 4 ;

   

    那现在再看上面的公式,所有小猴子分完剩余这些 ,(x+4)*( 4/5 )^n ,这个公式要想是整数,必须把分母 5^n 抵消掉,那就要求 x+4 是 5^n 的倍数就好了 ,它可以是 5^n ,5^(n+1),5^(n+2)... ,这些都可以使得结果为整数,但是要让整体值最小,那就取最小,也就是 5^n ,所以解出  x=5^n-4 ; 老猴子得到的数量为:old = (x+4)*(4/5)^n + n - 4  = 4^n + n - 4 。

    把思想理解了,公式也有了,这道题解起来,就非常简单了。

代码注释:

// write your code here// write your code 
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scan =new Scanner(System.in);
        while(scan.hasNextInt()){
            int n = scan.nextInt();
            if(n == 0)
                break;
            System.out.println((long)(Math.pow(5,n)-4)+" "+(long)(Math.pow(4,n)+n-4));
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值