黑马程序员技术交流社区
标题: 求解以下题 [打印本页]
作者: 自由007 时间: 2014-9-14 21:49
标题: 求解以下题
水手分椰子问题。 5个水手带着1只猴子来到一座荒岛,见岛上有大量椰子,他们便把这些椰子平均分成5堆,多余的一只给猴子吃了。夜籁人静,一个水手偷偷起来拿走了一堆椰子,把剩下的椰子又平均分成5堆,结果多出一只椰子丢给猴子吃掉了,过了一会儿,另一个水手也偷偷起来,拿走了一堆椰子后,再把剩下的椰子平均分成5堆,结果还是多了一只,丢给猴子吃了。就这样一个多事的夜晚,5个水手都偷偷藏起一堆,重分了椰子,每次都多出一只椰子让猴子占了便宜。第二天一早,岛上依然平均堆放着5堆椰子。试问:原先的椰子最少要有多少只?
作者: Imp_x 时间: 2014-9-14 22:36
开始我想着倒推出来= =假设最后每堆就一个椰子然后往回推 发现思路错了- -好吧 下面是度娘告诉我的答案 太久没动脑子 不好使了{: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个椰子.
作者: 爽朗的菜籽 时间: 2014-9-14 23:14
学习了,感谢二楼
作者: luofeng 时间: 2014-9-15 04:14
我写了个程序,用的是逆推得到的结果
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分。
我在这题上晕了好久,如果错了,希望有哪位大神指点下。
作者: 菜鸟一号 时间: 2014-9-15 09:42
二楼的度娘V5
作者: 笑脸迷人 时间: 2014-9-15 12:50
本帖最后由 笑脸迷人 于 2014-9-15 12:55 编辑
思路:
*最初的cocoNum要满足 (cocoNum-1)能够整除5;则cocoNum=(cocoNum-1)/5*4;,连续5次都能满足这个条件后,这个cocoNum所得的数称之为椰子数,就是最初的椰子数
*使用计数器count记录椰子数连续满足的次数,如果count>5次就得到了
代码如下:
- public class Shuishou {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- getInitialNum();
- }
- private static boolean isCocoNum(int cocoNum)//判断这个数是否是椰子数
- {
- int count=0;//计数器,记录当前数能满足分椰子条件的次数
- while(count<5){
- if((cocoNum-1)%5==0)
- {
- cocoNum=(cocoNum-1)/5*4;
- count++;
- }
- else
- break;
- }
- if(count>=5)//如果满足条件次数大于4次,就说明这个数就是椰子数
- return true;
- return false;
- }
- public static void getInitialNum(){
- int i=1;
- for(;true;i++)//无限循环,获取最小的椰子数
- {
- if(isCocoNum(i))
- break;
- }
- System.out.println("最初有"+i+"个椰子!");
- for(int j=0;j<5;j++)
- {
- i=(i-1)/5;
- System.out.println("给猴子一个后,将椰子分成5堆,每堆个数为(第"+(j+1)+"个人藏起来的椰子数):"+i);
- i=4*i;
- System.out.println("剩下的椰子数为"+i);
- }
- }
- }
复制代码 打印结果:
最初有3121个椰子!给猴子一个后,将椰子分成5堆,每堆个数为(第1个人藏起来的椰子数):624
剩下的椰子数为2496
给猴子一个后,将椰子分成5堆,每堆个数为(第2个人藏起来的椰子数):499
剩下的椰子数为1996
给猴子一个后,将椰子分成5堆,每堆个数为(第3个人藏起来的椰子数):399
剩下的椰子数为1596
给猴子一个后,将椰子分成5堆,每堆个数为(第4个人藏起来的椰子数):319
剩下的椰子数为1276
给猴子一个后,将椰子分成5堆,每堆个数为(第5个人藏起来的椰子数):255
剩下的椰子数为1020
最后的1020再分成5堆就成了~
作者: 石头-剪刀 时间: 2014-9-15 13:38
2楼的不是用编程思想解决问题。
我用纸写了之后感觉可以使用递归来解决这个问题,代码也简单很多,下面是我的代码- public class Test{
- public static boolean flag = false;
- public static void main(String[] args){
- long sum = 12;
- int time =1;
- while(!flag){
- flag = dividePile(sum,time);
- sum++;
-
- }
- System.out.println("sum=" + --sum);
- }
-
-
- public static boolean dividePile(long sum ,int time){
- if(time <= 5){
- if((sum - 1)% 5 ==0){
- sum = (sum -1)/5*4;
- time++;
- return dividePile(sum,time);
- }
- else{
- return false;
- }
-
- }
- return true;
- }
-
- }
复制代码
作者: Imp_x 时间: 2014-9-15 19:54
开始我也想着倒推 但是如果最后那堆只剩一个的话 往回推回去 每一堆里的椰子数不为整数~ ~所以肯定不是一个 我就放弃这样倒推了{:3_61:}
| 欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |