关于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.
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步