A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 自由007 初级黑马   /  2014-9-14 21:49  /  1678 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

水手分椰子问题。  5个水手带着1只猴子来到一座荒岛,见岛上有大量椰子,他们便把这些椰子平均分成5堆,多余的一只给猴子吃了。夜籁人静,一个水手偷偷起来拿走了一堆椰子,把剩下的椰子又平均分成5堆,结果多出一只椰子丢给猴子吃掉了,过了一会儿,另一个水手也偷偷起来,拿走了一堆椰子后,再把剩下的椰子平均分成5堆,结果还是多了一只,丢给猴子吃了。就这样一个多事的夜晚,5个水手都偷偷藏起一堆,重分了椰子,每次都多出一只椰子让猴子占了便宜。第二天一早,岛上依然平均堆放着5堆椰子。试问:原先的椰子最少要有多少只?

7 个回复

倒序浏览
开始我想着倒推出来= =假设最后每堆就一个椰子然后往回推  发现思路错了- -好吧 下面是度娘告诉我的答案 太久没动脑子  不好使了{:3_61:}万恶的度娘  我要拜摆脱你~ ~

分析与解:
设开始有x个椰子,我们把x写成(x+4)-4.
第一个人来了,分给猴子1个,此时还有椰子
(x+4)-4-1=(x+4)-5,
这时恰好可分成5份,每份的椰子数为
[(x+4)-5]/5=(x+4)/5-1
(x+4)/5必须为整数,所以(x+4)是5的倍数,
第一个人拿走一份后,剩下的椰子为:
(4/5)×[(x+4)-5]=(4/5)×(x+4)-4
同样,第二个人来了,分给猴子1个,拿走一份之后,剩下的椰子数为
(4/5)×[(4/5)×(x+4)-5]
由于(4/5)×(4/5)×(x+4)是整数,故(x+4)应是5×5=25的倍数,
如此一来五个人一分一拿,恰好剩下
(4/5)×(4/5)× (4/5)×(4/5) ×(4/5) ×(x+4)-5个椰子,
故(x+4)必须是5×5×5×5×5的倍数,
即x+4=5^5
所以: x=3125-4=3121
即开始最少有3121个椰子.
回复 使用道具 举报
学习了,感谢二楼
回复 使用道具 举报
我写了个程序,用的是逆推得到的结果
class  YeziMath
{
        //主函数
        public static void main(String[] args)
        {
                //遍历寻找符合条件的数
                for(int j=1;;j++)
                {
                        if(yezi(j)!=0)
                        {
                                System.out.println(j+"岛上椰子数最少为:"+yezi(j));
                                break;
                        }                       
                }
        }
        //解题函数,传入的value值是最后剩下的椰子数
        public static int yezi(int value)
        {
                int count = 0;
               
                for(int i=0;i<5;i++)
                {
                        if(value%5!=0)
                                break;
                        if((value+1)%4!=0)
                                break;
                        value = (value+1)*5/4;
                        count++;
                }
                if(count==5)
                {
                        value++;
                        return value;
                }
                return 0;
        }
}

运行结果是:5115岛上椰子数最少为:15621;
5115是遍历到的值,感觉结果没有楼上的靠谱,不过如果子函数内的for循环少循环一次,结果也是3121.
但是如果开始是3121个椰子,5个水手取后剩1019个并不能平均分成5分。
我在这题上晕了好久,如果错了,希望有哪位大神指点下。
回复 使用道具 举报
Imp_x 发表于 2014-9-14 22:36
开始我想着倒推出来= =假设最后每堆就一个椰子然后往回推  发现思路错了- -好吧 下面是度娘告诉我的答案 太 ...

二楼的度娘V5
回复 使用道具 举报
本帖最后由 笑脸迷人 于 2014-9-15 12:55 编辑

思路:
*最初的cocoNum要满足 (cocoNum-1)能够整除5;则cocoNum=(cocoNum-1)/5*4;,连续5次都能满足这个条件后,这个cocoNum所得的数称之为椰子数,就是最初的椰子数
*使用计数器count记录椰子数连续满足的次数,如果count>5次就得到了
代码如下:
  1. public class Shuishou {
  2.         public static void main(String[] args) {
  3.                 // TODO Auto-generated method stub
  4.                 getInitialNum();
  5.         }
  6.         private static boolean isCocoNum(int cocoNum)//判断这个数是否是椰子数
  7.         {
  8.                 int count=0;//计数器,记录当前数能满足分椰子条件的次数        
  9.                 while(count<5){
  10.                         if((cocoNum-1)%5==0)
  11.                         {
  12.                                 cocoNum=(cocoNum-1)/5*4;
  13.                                 count++;
  14.                         }
  15.                         else
  16.                                 break;
  17.                 }
  18.                 if(count>=5)//如果满足条件次数大于4次,就说明这个数就是椰子数
  19.                         return true;
  20.                 return false;
  21.         }
  22.         public static void getInitialNum(){
  23.                 int i=1;
  24.                 for(;true;i++)//无限循环,获取最小的椰子数
  25.                 {
  26.                         if(isCocoNum(i))
  27.                                 break;
  28.                 }
  29.                 System.out.println("最初有"+i+"个椰子!");
  30.                 for(int j=0;j<5;j++)
  31.                 {
  32.                         i=(i-1)/5;
  33.                         System.out.println("给猴子一个后,将椰子分成5堆,每堆个数为(第"+(j+1)+"个人藏起来的椰子数):"+i);
  34.                         i=4*i;
  35.                         System.out.println("剩下的椰子数为"+i);
  36.                 }
  37.         }
  38. }
复制代码
打印结果:
最初有3121个椰子!给猴子一个后,将椰子分成5堆,每堆个数为(第1个人藏起来的椰子数):624
剩下的椰子数为2496
给猴子一个后,将椰子分成5堆,每堆个数为(第2个人藏起来的椰子数):499
剩下的椰子数为1996
给猴子一个后,将椰子分成5堆,每堆个数为(第3个人藏起来的椰子数):399
剩下的椰子数为1596
给猴子一个后,将椰子分成5堆,每堆个数为(第4个人藏起来的椰子数):319
剩下的椰子数为1276
给猴子一个后,将椰子分成5堆,每堆个数为(第5个人藏起来的椰子数):255
剩下的椰子数为1020

最后的1020再分成5堆就成了~




回复 使用道具 举报
2楼的不是用编程思想解决问题。
我用纸写了之后感觉可以使用递归来解决这个问题,代码也简单很多,下面是我的代码
  1. public class Test{
  2.         public static boolean flag = false;
  3.         public static void main(String[] args){
  4.                 long sum = 12;
  5.                 int time =1;
  6.                 while(!flag){
  7.                         flag = dividePile(sum,time);
  8.                         sum++;
  9.                        
  10.                 }
  11.                 System.out.println("sum=" + --sum);
  12.         }
  13.        
  14.        
  15.         public static boolean dividePile(long sum ,int time){
  16.                 if(time <= 5){
  17.                         if((sum - 1)% 5 ==0){
  18.                                 sum = (sum -1)/5*4;
  19.                                 time++;
  20.                                 return dividePile(sum,time);
  21.                         }
  22.                         else{
  23.                                 return false;
  24.                         }
  25.                        
  26.                 }
  27.                 return true;
  28.         }
  29.        
  30. }
复制代码



回复 使用道具 举报
Imp_x 高级黑马 2014-9-15 19:54:57
8#
luofeng 发表于 2014-9-15 04:14
我写了个程序,用的是逆推得到的结果
class  YeziMath
{

开始我也想着倒推  但是如果最后那堆只剩一个的话  往回推回去 每一堆里的椰子数不为整数~ ~所以肯定不是一个  我就放弃这样倒推了{:3_61:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马