早教吧 育儿知识 作业答案 考试题库 百科 知识分享

JAVA问题,代码怎么写呢?谁能写得出?有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,

题目详情
JAVA问题,代码怎么写呢?谁能写得出?
有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。
等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
如果有多个可能的答案,请列出所有答案,每个答案占一行。
格式是:人数,人数,...
例如,有一种可能是:20,5,4,2,0
我没积分了
▼优质解答
答案和解析
这么复杂的问题,用Java来写……只不过是考验算法了……
我计算了一下,应该只有一个答案: 6,3,2,1,0
不知道我的理解是否有偏差……
船长应该是喝了3轮就倒下了,而船长总共喝了1瓶。我写的程序是这样子的:
public final class Test {
public static void main(String[] args) throws InterruptedException {
int a; // 总人数
int b; // 第一轮之后,第二轮之前的人数
int c; // 第二轮之后,第三轮之前的人数
int d; // 第三轮之后,第四轮之前的人数
int e; // 第四轮之后的人数

/* result_up开头的,都是分子 , result_down开头的,都是分母 */
/* result_up1表示第一轮之后的分子,result_down1表示第一轮之后的分母, */
/* result_up1 / result_down1 表示第一轮之后,船长喝下的酒的总和相当于一瓶酒的几分之几 */
int result_up1;
int result_down1;
int result_up2;
int result_down2;
int result_up3;
int result_down3;

// 如果海盗船长在第四轮之前就倒下了,就不需要这2行代码了
// int result_up4;
// int result_down4;

for (int i = 20; i > 3; i--) {
a = i;
result_up1 = 1;
result_down1 = i;
for (int j = i - 1; j > 2; j--) {
b = j;
result_up2 = result_up1 * j + result_down1;
result_down2 = result_down1 * j;
for (int k = j - 1; k > 1; k--) {
c = k;
result_up3 = result_up2 * k + result_down2;
result_down3 = result_down2 * k;
for (int l = k - 1; l > 0; l--) {
d = l;
for (int m = l - 1; m > -1; m--) {
e = m;

// 如果海盗船长在第四轮之前就倒下了,就不需要这一行代码了
// result_up4 = result_up3 * k + result_down3;

// 如果海盗船长在第四轮之前就倒下了,就不需要这一行代码了
// result_down4 = result_down3 * k;

/* 判断海盗船长是否总共喝够一瓶 */
if (result_up2 == result_down2 || result_up3 == result_down3
// 如果海盗船长在第四轮之前就倒下了,就不需要这一行代码了
// || result_up4 == result_down4) {
) {
System.out.print(a + "," + b + "," + c + "," + d + "," + e + " ");
System.out.println("true");
}
}
}
}
}
}
}
}
嗯,如果还有什么疑问,可以+ Q,470372-243(去掉-)