1. 问题描述
有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。
等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
如果有多个可能的答案,请列出所有答案,每个答案占一行。
格式是:人数,人数,...
例如,有一种可能是:20,5,4,2,0
2. 思路分析:
① 关键的信息是海盗船长正好喝了一瓶,所以将每一轮海盗船长喝的酒加起来最后等于一瓶那么就可以解决了,因为我们不知道每一轮喝酒的人数有多少,而且我们知道每一轮的人数都是不超过20人的,那么我们可以枚举每一轮的人数这样去一个一个尝试,并且每一轮的人数减1
② 通过上面的分析可以知道:1.0 / x1 + 1.0 / x2 + 1.0 / x3 + 1.0 / x4 == 1
使用1.0浮点数是为了最后在除的时候能够转化为浮点数来进行计算
public class Main {
public static void main(String[] args) {
for(int x1 = 20; x1 >= 1; x1--){
for(int x2 = x1 - 1; x2 >= 1; x2--){
for(int x3 = x2 - 1; x3 >= 1; x3--){
for(int x4 = x3 - 1; x4 >= 1; x4--){
if(1.0 / x1 + 1.0 / x2 + 1.0 / x3 + 1.0 / x4 == 1){
System.out.println(x1 + "," + x2 + "," + x3 + "," + x4 + ",0");
}
}
}
}
}
}
}