比酒量.txt
有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。
等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
哪位大侠能用java程序实现下面的题目
答案:3 悬赏:20
解决时间 2021-11-07 09:24
- 提问者网友:追忆成伤
- 2021-11-07 01:38
最佳答案
- 二级知识专家网友:厭世為王
- 2021-11-07 03:11
这道题可以这么来分解。
把整数'1'分解为以下形式。
1 = 1/a + 1/b + 1/c + 1/d,并且 0 < a, b, c, d < 20.,a,b,c,d都是整数。
a, b, c, d 代表每喝完一瓶酒后,剩余的海盗数量。
假设最开始海盗数量一共为x人,那么a = x, 那么海盗船长第一次喝了 1/x瓶酒
喝完第一瓶酒之后,还剩余b人,即第一次喝倒了x-b人,第二次海盗船长喝了1/b瓶酒。。。。
依次类推。海盗船一共喝了 1/x + 1/b + 1/c + 1/d = 1瓶酒。
写程序就这么写吧。
==============================
public class haidao {
public static void main(String[] args) {
int minPerson = 1;
double allPersons = 4;
while (allPersons <= 20) {
int firstPersons = minPerson;
while (firstPersons <= allPersons) {
int secondPersons = minPerson;
while (secondPersons <= allPersons - firstPersons) {
int thirdPersons = minPerson;
while (thirdPersons <= allPersons - firstPersons
- secondPersons) {
double captionDrinkedTotal = 1.0/allPersons
+ 1.0/(allPersons - firstPersons)
+ 1.0/(allPersons - firstPersons - secondPersons)
+ 1.0/(allPersons - firstPersons - secondPersons - thirdPersons)
- 1;
if (Math.abs(captionDrinkedTotal) < 0.00000001) {
System.out.print("海盗总数:" + allPersons);
System.out.print(" 第一次喝倒人数:" + firstPersons);
System.out.print(" 第二次喝倒人数:" + secondPersons);
System.out.println(" 第三次喝倒人数:" + thirdPersons);
}
thirdPersons++;
}
secondPersons++;
}
firstPersons++;
}
allPersons++;
}
}
}
==========
运行结果:
海盗总数:12.0 第一次喝倒人数:6 第二次喝倒人数:2 第三次喝倒人数:2
海盗总数:15.0 第一次喝倒人数:5 第二次喝倒人数:7 第三次喝倒人数:1
海盗总数:18.0 第一次喝倒人数:9 第二次喝倒人数:6 第三次喝倒人数:1
海盗总数:20.0 第一次喝倒人数:15 第二次喝倒人数:1 第三次喝倒人数:2
==========
PS:只要把minPerson = 1,改为 minPerson = 0,就可以允许某次喝酒没有海盗倒下。
把整数'1'分解为以下形式。
1 = 1/a + 1/b + 1/c + 1/d,并且 0 < a, b, c, d < 20.,a,b,c,d都是整数。
a, b, c, d 代表每喝完一瓶酒后,剩余的海盗数量。
假设最开始海盗数量一共为x人,那么a = x, 那么海盗船长第一次喝了 1/x瓶酒
喝完第一瓶酒之后,还剩余b人,即第一次喝倒了x-b人,第二次海盗船长喝了1/b瓶酒。。。。
依次类推。海盗船一共喝了 1/x + 1/b + 1/c + 1/d = 1瓶酒。
写程序就这么写吧。
==============================
public class haidao {
public static void main(String[] args) {
int minPerson = 1;
double allPersons = 4;
while (allPersons <= 20) {
int firstPersons = minPerson;
while (firstPersons <= allPersons) {
int secondPersons = minPerson;
while (secondPersons <= allPersons - firstPersons) {
int thirdPersons = minPerson;
while (thirdPersons <= allPersons - firstPersons
- secondPersons) {
double captionDrinkedTotal = 1.0/allPersons
+ 1.0/(allPersons - firstPersons)
+ 1.0/(allPersons - firstPersons - secondPersons)
+ 1.0/(allPersons - firstPersons - secondPersons - thirdPersons)
- 1;
if (Math.abs(captionDrinkedTotal) < 0.00000001) {
System.out.print("海盗总数:" + allPersons);
System.out.print(" 第一次喝倒人数:" + firstPersons);
System.out.print(" 第二次喝倒人数:" + secondPersons);
System.out.println(" 第三次喝倒人数:" + thirdPersons);
}
thirdPersons++;
}
secondPersons++;
}
firstPersons++;
}
allPersons++;
}
}
}
==========
运行结果:
海盗总数:12.0 第一次喝倒人数:6 第二次喝倒人数:2 第三次喝倒人数:2
海盗总数:15.0 第一次喝倒人数:5 第二次喝倒人数:7 第三次喝倒人数:1
海盗总数:18.0 第一次喝倒人数:9 第二次喝倒人数:6 第三次喝倒人数:1
海盗总数:20.0 第一次喝倒人数:15 第二次喝倒人数:1 第三次喝倒人数:2
==========
PS:只要把minPerson = 1,改为 minPerson = 0,就可以允许某次喝酒没有海盗倒下。
全部回答
- 1楼网友:输掉的尊严
- 2021-11-07 04:20
这个代码我就不说了 你看看我的思路 你写个 for(int i=1; i<20;i--){
if(i==j) break ;
} 这样就第一瓶喝完了 下面你在想想
- 2楼网友:年轻没有失败
- 2021-11-07 03:42
下面的代码在输出i的时候都犯了2个小错误,那就是i是从0开始的,所以如果检测到有该元素时,应该是第i+1个元素,第二个错误就是输出"无此数"该语句放在循环内的,那么执行一次for语句就会输出一次无此数,修改后最终代码如下:
package mypkg;
import java.util.scanner;
public class mypkg {
public static void main(string[] args) {
int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
scanner s = new scanner(system.in);
system.out.print("请输入:");
int n = s.nextint();
if (n >= 1 && n <= 10) { //先判断输入的数字是否在1~9,如果在就检测是第几个,如果没在就直接输出无此数
for (int i = 0; i < a.length; i++) {
if (a[i] == n) {
int j = i + 1;
system.out.println(n + "是数组中第" + j + "个元素");
}
}
} else {
system.out.println("无此数");
}
}
}
测试结果:
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯