黑马程序员技术交流社区

标题: 猴子分桃的问题 [打印本页]

作者: 闫镜湾    时间: 2014-5-24 00:41
标题: 猴子分桃的问题
海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
作者: Sevenette    时间: 2014-5-24 00:45
。。。用递归 话说怎么感觉你在刷屏
作者: 北极£莜蓝    时间: 2014-6-1 18:59
class Monkey {
/*海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,
        拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,
        第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?*/
                                                                                                       
        public static void main(String[] args) {
                int x = taoZi(5);
                System.out.println(x);
       
        }
        public static int taoZi(int num) {
               
                if(num == 0)
                        return 1;//第5只猴子分完后,手里剩下1只桃子,(满足最少要求)
                else
                        return taoZi(num-1) * 5+ 1;
        }
}
作者: MissSur    时间: 2014-6-3 15:54
最后剩余桃子:1020个
海滩上原来最少有桃子:3121个

  1. public class MonkeyPeach {
  2.         public static void main(String[] args) {
  3.                 int num = 0;
  4.                 int peach=0;
  5.                 boolean flag = true;

  6.                 while (flag) {
  7.                         num+=4;
  8.                         peach = num;
  9.                         int i = 1;
  10.                         for (i = 1; i <= 5; i++) {
  11.                                 if (peach % 4 == 0) {
  12.                                         flag = false;
  13.                                         peach = peach + peach / 4 + 1;
  14.                                 } else {
  15.                                         flag = true;
  16.                                         break;
  17.                                 }
  18.                         }                       
  19.                 }               
  20.                 System.out.println("last:"+num);
  21.                 System.out.println("total peach:"+peach);
  22.         }
  23. }
复制代码


请老师点评
作者: cat73    时间: 2014-7-5 18:40
本帖最后由 cat73 于 2014-7-5 18:45 编辑

这道题我的思路是这样的:
1.先理清数据之间的关系
假设最后一个猴子拿走了n个桃子,那么拿n*4就是最后剩下的桃子,n*5+1就是最后一只猴子拿之前剩下的桃子
最后一个猴子拿之前剩下的桃子/4*5+1就是第二个猴子拿之前剩下的桃子,依次类推上去
然后由于桃子的数量只可能是整数,所以只要判断这里面出现的所有数据是否都是整数即可

表格中的分析,绿色标记的是i的值:



  1.         public static void main(String[] args) {
  2.                
  3.                 int i = 0;
  4.                 while(!checkNum(++i));
  5.                 System.out.println("最后一个猴子拿走了" + i + "个桃子");
  6.                 System.out.println("最初的桃子数为:" + (((((i * 5 + 1) / 4 * 5 + 1) / 4 * 5 + 1) / 4 * 5 + 1) / 4 * 5 + 1));
  7.         }
  8.         
  9.         /**
  10.          * 检查传入的num是否符合条件
  11.          * @param num 最后一个猴子拿走的桃子数
  12.          * @return
  13.          */
  14.         public static boolean checkNum(int num){
  15.                 double t = num;
  16.                 t *= 5;
  17.                 t++;//最后一个猴子拿之前的桃子数
  18.                
  19.                 for(int i = 0; i < 4; i++){
  20.                         t = t / 4 * 5 + 1;//计算出上次分桃之前剩余的桃子数量
  21.                         
  22.                         //检查本次要分的桃子数, 本次剩下的桃子数, 本次拿走的桃子数是否都是整数
  23.                         if(!(isInt(t) && isInt((t - 1) / 5 * 4) && isInt((t - 1) / 5)))
  24.                                 return false;
  25.                 }
  26.                 return true;
  27.         }
  28.         
  29.         /**
  30.          * 检查一个数是否为整数
  31.          * @param num 数字
  32.          * @return 是否为整数
  33.          */
  34.         public static boolean isInt(double num){
  35.                 return (((int) num) == num);
  36.         }
复制代码

输出为:
最后一个猴子拿走了255个桃子
最初的桃子数为:3121






作者: 梦与现实    时间: 2014-11-5 03:46
/* 多的不说 直接上代码 */  public class MonkeyPeach{ public static void main(String[] args){                 int n=1;                 int m=0;                 int flag=1;                 int monkeyNum=5;                  //这里我们利用while循环(死循环)                 while(true)                         {                         llag=1;                         m=monkeyNum*n+1;                         for(int i=monkeyNum;i>=1;i--){                         if(m%(monkeyNum-1)==0){                                 flag++;//计算多少次的桃子数可以被4整除                                         }                                                          else                                 break;                         }                 if(flag==monkeyNum)//每次的桃子都可以被4整除                         break;                 n++;         }                 System.out.println("开始的桃子至少是:"+m);                 System.out.println("此时第5个猴子得到桃子数是:"+n);         }   }
作者: 梦与现实    时间: 2014-11-5 03:48
/*
多的不说 直接上代码
*/

public class MonkeyPeach{
public static void main(String[] args){
                int n=1;
                int m=0;
                int flag=1;
                int monkeyNum=5;

                //这里我们利用while循环(死循环)
                while(true)
                        {
                        llag=1;
                        m=monkeyNum*n+1;
                        for(int i=monkeyNum;i>=1;i--){
                        if(m%(monkeyNum-1)==0){
                                flag++;//计算多少次的桃子数可以被4整除
                                        }
                               
                        else
                                break;
                        }
                if(flag==monkeyNum)//每次的桃子都可以被4整除
                        break;
                n++;
        }
                System.out.println("开始的桃子至少是:"+m);
                System.out.println("此时第5个猴子得到桃子数是:"+n);
        }


}
//刚才快速回复码乱了 再来一次  看到那么久都没解决 我回答下
作者: 邹中源    时间: 2014-11-10 09:46
表数学渣,笔试不会这么坑吧
作者: 路尽鹭飞    时间: 2015-1-17 22:50
感觉楼主水平一般啊
作者: 黑小白    时间: 2016-9-14 16:30
我以为只是简单的数学题!看来我还要继续学习黑客知识~新人求指教!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2