黑马程序员技术交流社区

标题: 分享一道经典题兼求助寻求更优解法 [打印本页]

作者: 箫庐    时间: 2011-12-6 17:35
标题: 分享一道经典题兼求助寻求更优解法
本帖最后由 箫庐 于 2011-12-8 10:54 编辑

题目:

        海滩上有一堆桃子和五只猴子
        第一只猴子先来到海滩上, 发现了桃子, 将桃子分成5份, 发现多了一个, 把多的一个扔到了海里, 拿走了一份
        第二只猴子也来到海滩上, 发现桃子之后也是分成5份, 又多了一个, 还是扔到海里, 拿走了一份
        后面三只猴子都是这么做的, 问海滩上最初最少有多少个桃子?
-----------------------------------------------------------------------------------------
        这是基础班第五天付老师布置的一道题目,我花了大半晚上熬夜再做出来的;但是很繁琐,大家看有没有更优化的编程?

       另,管理员多给点技术分嘛~~我着急呢,现在北京上基础班,没有多少时间来上网.没多少时间了,担心技术分不够,极想上六期呢!

       我的程序:

            int i = 6,ii=0;
            int j = 5;
            boolean b = false;
            for (j = 5; j >= 1; ){
                if ((((i - 1) % 5)) == 0){
                    if (j == 5)
                        ii = i;
                    j--;
                    i = (i - ((i - 1) / 5)) - 1;
                    b = true;
                }else{
                    if (b){
                        j = 5;
                        i = ii + 1;
                        b = false;
                    } else
                        i++;
                }
            }
           System.out.println("海滩上最初的桃子个数为:"+ii+"个~");
作者: fly51888    时间: 2011-12-6 18:27
同学你再看看你的这个问题,有没有写错什么或漏掉什么,怎么感觉没有边界。你自己写的那个6是什么意思?我在网上看到这个题是求最少有多少个桃子。
作者: wsssx    时间: 2011-12-6 18:40
提示: 作者被禁止或删除 内容自动屏蔽
作者: wsssx    时间: 2011-12-7 08:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: 方书堂    时间: 2011-12-7 12:54
本帖最后由 方书堂 于 2011-12-8 09:52 编辑

{:soso_e109:}  思路错了
作者: 黄喆    时间: 2011-12-7 16:05
本帖最后由 黄喆 于 2011-12-8 09:22 编辑

class PeachNum
{
        public static void main(String[] args)
        {
                int num;
                int total = 5;               
                boolean b = true;
                while (b)
                {
                        total++;
                        num = total;
                        for(int x=0;x<5;x++)
                        {                                                         
                                if(((num-1)%5)!=0)
                                        break;
                                else                                                                               
                                        num= 4*(num-1)/5;                                                                                                 
                                if (x==4)
                                {                                          
                                        b = false;
                                        System.out.println("共有"+total+"个桃子");                                         
                                }                               
                        }
                }       
                for(int x=1;x<=5;x++)
                {
                        int m = (total-1)/5;
                        System.out.println("第"+x+"只猴子拿了" +m+"个桃子。");
                          total = 4*m;
                }               
        }
}

运行结果 共有3121个桃子,第一只猴子拿了624个,第二只猴子拿了499个,第三只猴子拿了399个,第四只猴子拿了319个,第5只猴子拿了255个
作者: 箫庐    时间: 2011-12-8 08:50
本帖最后由 箫庐 于 2011-12-8 10:05 编辑
wsssx 发表于 2011-12-6 18:40
求最好有多少桃子的话,直接从最后一个猴子开始,最小的数,可以分成5分还多一个的是6,然后向上累加不就可 ...


最少是 3121个;
往后面加的话有无数个答案;
作者: 箫庐    时间: 2011-12-8 08:53
wsssx 发表于 2011-12-7 08:17
这道题目的思路是这样的:设最后一个猴子最后拿走的桃子是x,桃子的总量是y。假设x=1,y是一个分数,但桃子 ...

嗯.确实是最少有多少个.不然有多个答案.
我的6是随便赋值的.因为一个猴子要分五份余一个,至少要6个.从1开始也可以的.

不过我也迷糊了,自己写的这个条件.满足最少的桃子数后,是怎么跳出循环的~~能不能帮我解释下嘛.我自己是知道老师给的答案数值,凑合写出来的程序.隔了两天,也有点看不懂了,不知道是怎么跳出循环的……晕
作者: 黄喆    时间: 2011-12-8 09:20
箫庐 发表于 2011-12-8 08:50
最少是 3123个;
往后面加的话有无数个答案;

3123 第一只猴子就不能分成5份
作者: 箫庐    时间: 2011-12-8 10:07
黄喆 发表于 2011-12-8 09:20
3123 第一只猴子就不能分成5份

嗯嗯.
上课前看帖子,匆忙回复的.
是3121个.
顺便帮我分析下我原来写的程序是怎么跳出循环呢?结果是碰对了,也就只有一个3121.说明得出3121就跳出循环了.但我居然不知道是怎么跳出循环的,谢谢~~
作者: 方书堂    时间: 2011-12-8 10:20
黄喆 发表于 2011-12-7 16:05
class PeachNum
{
        public static void main(String[] args)

受教了,原来自己的思路一直想错了。。没有把每次留下的桃子是上次的4/5,考虑进来。。
作者: 黄喆    时间: 2011-12-8 10:50
箫庐 发表于 2011-12-8 10:07
嗯嗯.
上课前看帖子,匆忙回复的.
是3121个.

if ((((i - 1) % 5)) == 0) 条件满足一次 j--  一次,满足5次后j==0,for循环结束
作者: 箫庐    时间: 2011-12-8 10:53
黄喆 发表于 2011-12-8 10:50
if ((((i - 1) % 5)) == 0) 条件满足一次 j--  一次,满足5次后j==0,for循环结束

哦.谢谢哈.原来自己写的东西也会有不明白的时候.看来需要多写注释啊.经验啊.





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