有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。
等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
如果有多个可能的答案,请列出所有答案,每个答案占一行。
格式是:人数,人数,...
例如,有一种可能是:20,5,4,2,0
答案:
20.5.4.2.0
18.9.3.2.0
15.10.3.2.0
12.6.4.2.0
重要语句:不多于20人、打开一瓶酒,所有在场的人平分喝下,有几个人倒下了、开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中、当第4瓶酒平分喝下后,大家都倒下了、船长正好喝了一瓶。
解析:每一轮都是没倒下的人把一瓶新开的酒平分喝下,依题意船长撑到了第四轮,第四轮过后都倒下了,也就是说最后一个数是0。船长正好喝了一瓶这是一个重要线索,如果把船长每轮和的酒加起来=1,则满足条件输出一条结果就可以,根据题意四轮过后才都倒下,说明总人数至少是4人。用四个for循环+一个判断条件就可以做出来了
判断条件:1/i+1/j+1/k+1/m==1 可以转换为 j*k*m+i*k*m+i*j*m+i*j*k==i*j*k*m
代码如下:
public class 海盗拼酒
{
public static void main(String[] args)
{
for(int i=20;i>=4;--i) // 做多20人,一共喝了四轮所以至少有4人
{
for(int j=i-1;j>=3;--j) //最少倒下一人,坐着的至少3人
{
for(int k=j-1;k>=2;--k) //最少倒下一人,坐着的至少2人
{
for(int m=k-1;m>1;--m) //最少倒下一人,坐着的至少1人
{
if(j*k*m+i*k*m+i*j*m+i*j*k==i*j*k*m) //满足船长只喝了1瓶的条件
{ //把除法等式转换为乘法等式
System.out.println(i+"."+j+"."+k+"."+m+".0");
}
}
}
}
}
}
}
运行结果:
20.5.4.2.0
18.9.3.2.0
15.10.3.2.0
12.6.4.2.0