zoukankan      html  css  js  c++  java
  • 关于5只猴子分香蕉

          有5只猴子在海边发现一堆香蕉,决定第二天来平分,第二天清晨,第一只猴子最早来到,它左分右分分不开,就朝海里扔了一只,恰好可以分成5份,它拿上自己的一份走了。第2,3,4,5只猴子也遇到同样的问题,采用了同样的方法,都是扔掉一只后,恰好可以分成5份,问这堆香蕉至少有少只?

    方式一

    class Untitled {
        public static void main(String[] args) {
            int number;
            int count = 0;
            int i;
            for(i=6 ;;i=i+5){
                number = i;
                count = 0;
                while((number - 1) % 5 == 0){
                    count++;
                    number = (number -1) / 5 * 4;
                    if(count == 5){
                        break;
                    }
                }
                if(count == 5){
                    break;
                }
            }
            System.out.println(i);
        }
    }

    方式二 

    class Untitled {
        public static void main(String[] args) {
            System.out.println("沙滩上最少有" + count() + "个香蕉");
        }
    
        public static int count(){
            // n代表人数,k代表每次分配1份
            int n = 5, k = 1,min = 0;
            boolean flag = false;
    // j代表最后一个猴子分配之后的香蕉数量
    int j = 1; for(;;j++){ min = n*j+k; for(int i = 1;i < n;i++){ if(min % (n-1) == 0){ min = min * n / (n-1) +k; }else{ break; } if(i == n-1){ flag = true; break; } } if(flag == true){ break; } } System.out.println(j); return min; } }

    反推验证

    class Untitled {
    
        public static void main(String[] args) {
            System.out.println("---------" + (reverse(3121,5) == 1 ? "success":"fail") + "----------");
        }
    
        public static int reverse(int n,int m){
            //每次拿走后剩余num
            int num = n - 1 - (n - 1) / 5;
            m--;
            if(m > 0){
                //每次拿走的香蕉都能被5整除
                if((n - 1) % 5 == 0){
                    return reverse(num,m);
                } else {
                    return 0;
                }
            } else {
                return 1;
            }
        }
    }

    至少需要3121个香蕉,思路:采用倒推法.
    设第二天每一只猴子分a个香蕉
    第五只猴子未拿之前有:5a*(5/4)+1
    第四只猴子未拿之前有:5a*(5/4)²+5/4+1
    第三只猴子未拿之前有:5a*(5/4)³+(5/4)²+5/4+1
    第二只猴子未拿之前有:5a*(5/4)^4+(5/4)³+(5/4)²+5/4+1
    第一只猴子未拿之前有:5a*(5/4)^5+(5/4)^4+(5/4)³+(5/4)²+5/4+1 ··········①
    ①式后面5项为等比数列,求和有:5a*(5/4)^5+4*(5/4)^5-4=(5a+4)*(5/4)^5-4=min
    接下来求最小值min,令5a+4=4^5,解得a=204,带入即得min=3121.

  • 相关阅读:
    Jmeter系列(29)- 详解 JDBC Connection Configuration
    Jmeter系列(28)- 发送 soap 协议的接口
    Jmeter系列(27)- 详解正则提取器
    Jmeter系列(26)- 详解 JSON 提取器
    Jmeter系列(25)- 详解用户参数
    (五)、python 函数
    (四)、python 集合与格式化
    (三)、python运算符和基本数据类型
    Mysql: pt-table-checksum 和 pt-table-sync 检查主从一致性,实验过程
    (二)、Python 基础
  • 原文地址:https://www.cnblogs.com/rinack/p/11069113.html
Copyright © 2011-2022 走看看