当前位置: 代码迷 >> Java相关 >> 一道无数答案的题,帮忙解一下
  详细解决方案

一道无数答案的题,帮忙解一下

热度:338   发布时间:2010-05-25 18:49:41.0
一道无数答案的题,帮忙解一下
提示: 作者被禁止或删除 内容自动屏蔽
2010-05-25 10:49:41
linjx0123

等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
  得分:0 
程序代码:
public class Test {
    private void test(int num){
        for(int i=0;i<5;i++){
            System.out.println("第"+i+1+"次");
            System.out.println("num="+num);
            num--;
            System.out.println("扔掉一个="+num);
            System.out.println("平分5份,取走一份,为:"+num/5);
            num=num*4/5;
        }
    }
    public static void main(String[] args) {
        int num = 5;
        int i;
        int remain;
        for (int j = 1;; j++) {
            remain = 4 * j;
            for (i = 0; i < num; i++) {
                if (remain % 4 == 0) {
                    remain = remain * 5 / 4 + 1;
                } else
                    break;
            }
            if (i == num) {
                System.out.println(remain);
                break;
            }
        }
        Test t = new Test();
        t.test(remain);
    }

}

----------------解决方案--------------------------------------------------------
早上想了一下,觉得代码不够严密。修改了下
程序代码:
public class Test {
    private void test(int num){
        for(int i=0;i<5;i++){
            System.out.println("第"+i+1+"次");
            System.out.println("num="+num);
            num--;
            System.out.println("扔掉一个="+num);
            System.out.println("平分5份,取走一份,为:"+num/5);
            num=num*4/5;
        }
    }
    public static void main(String[] args) {
        int num = 5;
        int i;
        int remain;
        boolean b = false;
        for (int j = 1;; j++) {
            remain = 4 * j;
            for (i = 0; i < num; i++) {
                if (remain % 4 == 0) {
                    remain = remain * 5 / 4 + 1;
                    b=true;
                } else{
                    b=false;
                    break;
                }
            }
            if (i == num&&!b) {
                System.out.println(remain);
                break;
            }
        }
        Test t = new Test();
        t.test(remain);
    }

}

----------------解决方案--------------------------------------------------------
回复 2楼 linjx0123
提示: 作者被禁止或删除 内容自动屏蔽
2010-05-26 00:57:44
wtuaimmmm
该用户已被删除
  得分:0 
回复 3楼 linjx0123
提示: 作者被禁止或删除 内容自动屏蔽
2010-05-26 00:59:38
linjx0123

等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
  得分:4 
程序代码:
public class Test {
    private void test(int num){
        for(int i=0;i<5;i++){
            System.out.println("第"+i+1+"次");
            System.out.println("num="+num);
            num--;
            System.out.println("扔掉一个="+num);
            System.out.println("平分5份,取走一份,为:"+num/5);
            num=num*4/5;
        }
    }
    public static void main(String[] args) {
        int num = 5;
        int i;
        int remain;
        boolean b = false;
        for (int j = 1;; j++) {
            remain = 4 * j;
            for (i = 0; i < num; i++) {
                if (remain % 4 == 0) {
                    remain = remain * 5 / 4 + 1;
                    b=true;
                } else{
                    b=false;
                    break;
                }
            }
            if (i == num&&b) {
                System.out.println(remain);
                break;
            }
        }
        Test t = new Test();
        t.test(remain);
    }

}

----------------解决方案--------------------------------------------------------
修改后成为死循环,是因为逻辑出了点小错误,我觉得这样写跟题意完全符合。

程序是从最小值开始递增的。只要能测出结果符合题意,那么必定是最小值。
扔掉一个,平均5份,拿走一份,每一个数据都输出来,楼主可以自己看看是否正确,自己计算下不就知道了
----------------解决方案--------------------------------------------------------
修改下测试函数
程序代码:
public class Test {
    private boolean isRight(int num){
        if((num-1)%5==0&&num>1)
            return true;
        else return false;
    }
    private void test(int num){
        StringBuffer str = new StringBuffer();
        for(int i=0;i<5;i++){
            if(isRight(num)){
                 str.append("第"+(i+1)+"次\n");
                 str.append("num="+num+"\n");
                 num--;
                 str.append("扔掉一个="+num+"\n");
                 str.append("平分5份,取走一份,为:"+num/5+"\n");
                 num=num*4/5;
            }else{
                str.delete(0, str.length());
                break;
            }         
        }
        System.out.print(str);
    }
    public static void main(String[] args) {
        int num = 5;
        int i;
        int remain;
        boolean b = false;
        for (int j = 1;; j++) {
            remain = 4 * j;
            for (i = 0; i < num; i++) {
                if (remain % 4 == 0) {
                    remain = remain * 5 / 4 + 1;
                    b=true;
                } else{
                    b=false;
                    break;
                }
            }
            if (i == num&&b) {
                System.out.println(remain);
                break;
            }
        }
        Test t = new Test();
        for(int j=1;j<3123; j++){         
            t.test(j);
        }
    }
}

----------------解决方案--------------------------------------------------------
思路是这样的,最后扔掉一个桃子的时候,桃子还能够平均5份,那么这时剩下的桃子应该是5n(5的倍数)。
然后猴子又取走了一份,最后只剩下(5-1)*n个桃子。因为要使桃子最少,所以n从1开始算起。直到符合要求。

扔掉一个取走一份,假设原来有x个桃子,那么剩下的就为x-1-(x-1)/5 = (x-1)*4/5.现在已经知道剩下的为remain个桃子,那么上一次的桃子个数为:
remain * 5 / 4 + 1;依次类推,当满5次的时候就是答案。
----------------解决方案--------------------------------------------------------
  相关解决方案