本文编写于 135 天前,最后修改于 135 天前,其中某些信息可能已经过时。

【程序41】 MonkeyPeach.java
题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一
个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中
,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
注: 递归得到还没拿桃子时的桃子数,每次得到的值必须是整数

package test50;

/**
 * @author VellBibi
 *【程序41】 MonkeyPeach.java
 *题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一
 *个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中
 *,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
 */
public class MonkeyPeach {

    /**
     * 获得第n个猴子还没拿桃子时的桃子数
     * 最后一个猴子拿了m个桃子
     * @param n
     * @param m
     * @return
     */
    public static int getNum(int n, int m){
        if(n > 5) return m*4;
        else {
            double ans = getNum(n+1, m) / 4.0 * 5 + 1;
            if(ans%1 != 0.0 || ans == 1){//判断结果是否为整数,或者结果不为1
                return 0;
            }else
                return (int)ans;
        }
    }
    
    public static void main(String[] args) {
        int ans = 0;
        for(int i=1; ; i++){
            ans = getNum(1, i);
            if(ans != 0){
                System.out.println("当最后一只猴子拿走" + i + "个桃子时,海滩上原来桃子得到最小值为:");
                System.out.println(ans);
                break;
            }
        }
    }
}

反推数据:(验证结果是正确的)

感觉上面的实现方案有点小题大做了,要是直接验证结果的话会更快的得到答案,看代码:

package test50;

/**
 * @author VellBibi
 *【程序41】 MonkeyPeach_1.java
 *题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一
 *个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中
 *,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
 *1.程序分析:采取直接验证结果的方式
 */
public class MonkeyPeach_1 {

    public static boolean isRight(int n) {
        for(int i=0; i<5; i++) {
            if(n % 5 == 1) {
                n = n - 1;
                n = n - n / 5;
            }else
                return false;
        }
        return true;
    }

    public static void main(String[] args) {
        for(int n=1; ; n++) {
            if(isRight(n)) {
                System.out.println("海滩上原来桃子得到最小值为:" + n);
                return;
            }
        }
    }

}

【程序42】 Test4.java
题目:809??=800??+9*??+1
其中??代表的两位数,8??的结果为两位数,9??的结果为3位数。求??代表的两位数,及809*??后的结果。
注:这道题很有问题啊。没有结果~~~好生郁闷,看我的两种理解吧

第一种:所有的??代表同一个数

package test50;

/**
 * @author VellBibi
 *【程序42】 Test4.java
 *题目:809*??=800*??+9*??+1
 *其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。 
 */
public class Test4 {

    public static void main(String[] args) {
        for(int i=10; i<100 && 8*i<100 && 9*i<1000; i++){
            if(809*i == (800*i + 9*i + 1)){
                System.out.println("??代表的两位数:" + i);
                System.out.println("809*??后的结果" + i*809);
                return;
            }
        }
        System.out.println("没有符合的数");
    }
}

第二种:所有的??都不同

package test50;

/**
 * @author VellBibi
 *【程序42】 Test4.java
 *题目:809*??=800*??+9*??+1
 *其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。 
 */
public class Test4_1 {

    public static void main(String[] args) {
        for(int i=10; i<100; i++){
            for(int j=10; j<100 && 8*j<100; j++){
                for(int l=10; l<100 && 9*l<1000; l++){
                    if(809*i == 800*j + 9*l + 1){
                        System.out.println("809*"+i+" == 800*"+j+"+ 9*"+l+" + 1");
                        System.out.println("809*??后的结果" + i*809);
                        return;
                    }
                }
            }
        }
        System.out.println("没有符合的数");
    }
}

【程序43】 Test5.java
题目:求0—7所能组成的奇数个数。
注:当有一位数时:有1.3.5.7这4个奇数
当有两位数时:最高为有7种(除0)选择,最低为有4(1.3.5.7为奇数的条件)种 总数为4*7
当有三位数时:最高为有7中(除0)选择,第二位有8中选择,最后一位4种(1.3.5.7) 总数 487
当有四位数时:最高为有7中(除0)选择,第三位有8中选择,第二位有8中选择,最后一位4种(1.3.5.7) 总数 488*7
*
*
*
依次类推

package test50;

/**
 * @author VellBibi
 *【程序43】 Test5.java
 *题目:求0—7所能组成的奇数个数。
 * 注:当有一位数时:有1.3.5.7这4个奇数
 *  当有两位数时:最高为有7种(除0)选择,最低为有4(1.3.5.7为奇数的条件)种  总数为4*7
 *  当有三位数时:最高为有7中(除0)选择,第二位有8中选择,最后一位4种(1.3.5.7) 总数 4*8*7
 *  当有四位数时:最高为有7中(除0)选择,第三位有8中选择,第二位有8中选择,最后一位4种(1.3.5.7) 总数 4*8*8*7
 */
public class Test5 {
    
    public static void main(String[] args) {
        int cup = 7*4;//二位数
        int count = cup + 4;
        for(int i=2; i<8; i++){
            cup = 8*cup;
            count = count + cup;
        }
        System.out.println("0—7所能组成的奇数个数:" + count);
    }
}

【程序44】 TestEven.java
题目:一个偶数总能表示为两个素数之和。

package test50;

import java.util.Scanner;

/**
 * @author VellBibi
 *【程序44】 TestEven.java
 *题目:一个偶数总能表示为两个素数之和。
 */
public class TestEven {

    /**
     * 判断n是不是质数
     * @param n
     * @return
     */
    public static boolean isPrimeNumber(int n){
        if(n < 2)return false;
        
        for(int i=2; i<n; i++){
            if(n%i == 0)
                return false;
        }
        return true;
    }
    
    public static void main(String[] args) {
        int n = new Scanner(System.in).nextInt();
        
        if(n%2 != 0){
            System.out.println("输入的不是偶数");
            return;
        }
        
        for(int i=2; i<n; i++){
            if(isPrimeNumber(i) && isPrimeNumber(n - i)){
                System.out.println(n + " = " + i + "+" + (n-i));
                return;
            }
        }
    }
}

【程序45】TestPrime9.java
题目:判断一个素数能被几个9整除