黑马程序员技术交流社区
标题:
这个题 曾今把机房的机器卡死
[打印本页]
作者:
赵倩倩
时间:
2012-6-16 22:24
标题:
这个题 曾今把机房的机器卡死
有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。
等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
作者:
郭宁
时间:
2012-6-16 22:54
本帖最后由 郭宁 于 2012-6-16 23:01 编辑
/*
* 分析:
* 1、船长拿起酒杯到挂了 喝了 一瓶。假设第一天到第四天的人数一次为 a、b、c、d
* 则船长每天喝 1/a + 1/b + 1/c +1/d == 1
*
* 2、每天都有人 挂 所以今天 至少比昨天少一个人
*
* 3、木有了
* */
public class Demo{
public static void main(String[] args){
for(int a=20; a>=5; )
for(int b=--a; b>=4; )
for(int c=--b; c>=3; )
for(int d=--c; d>=2; --d){
if((1.0/a+1.0/b+1.0/c+1.0/d)==1){
System.out.println(a+":"+b+":"+c+":"+d);
break;
}
}
}
}
结果:
18:9:3:2
15:10:3:2
12:6:4:2
12:4:3:3
有个疑惑:为什么 会出现 12:4:3:3 带重复的?
复制代码
作者:
李盼
时间:
2012-6-16 23:29
本帖最后由 李盼 于 2012-6-17 00:05 编辑
//思路:x1,x2,x3,x4分别为第一次喝酒...第四次喝酒的人数。因为四次喝酒船长喝了一瓶
//那么第四次喝酒的人不能超过4个。如果超过了4个,那么船长每次喝酒都不会超过1/4之一,怎么会4次喝一瓶呢
//第四次喝酒的也也不能少于两个,少于两个就是船长一个人,那么他第四次就喝了一瓶,加上前三次的,超过了1瓶
//那么x4的取值就是1<x4<4,也就是2,3两个值,于是外循环我定义的取值范围可以定义好了.
//因为每次有人倒下,以每次最少倒1人计算,所以x1<20,x2<19 ,x3<18且3<x3,4<x2,5<x5;
public class Test2 {
public static void main(String[] args){
for (int x4 = 2; x4 < 4; x4++)
{
for (int x3 = x4+1; x3 <= 18; x3++)
{
for (int x2 = x3+1; x2 <= 19; x2++)
{
for (int x1 = x2+1; x1 <= 20; x1++)
{
if((1.0/x1+1.0/x2+1.0/x3+1.0/x4)==1.0)
{
System.out.println(x1+":"+x2+":"+x3+":"+x4);
break;
}
}
}
}
}
}
}
结果为
18:9:3:2
15:10:3:2
20:5:4:2
12:6:4:2
作者:
张頔
时间:
2012-6-17 00:09
/*
* a,b,c,d每次的人数
* 因为每一次都会有人倒下,所以a<=20,b<=19,c<=18,d<=17,并且后一次的人数总比前一次的少
* 又因为船长说4次他喝了一瓶所以第4次的人数一定小于4,叫船长喝了大于1/4瓶,因为如果最后一次大于4人的话
* 船长喝的就会小于1/4瓶,而前几次的人数也会大于4这样船长就会喝不到一瓶,所以d<4
* */
class Demo
{
public static void main(String[] args)
{
for(int d=2;d<4;d++){//第4瓶酒,坐着的已经所剩无几,海盗船长也在其中所以2<=d<4
for(int c=d+1;c<=18;c++){//掐你因此的人数总比后边的多
for(int b=c+1;b<=19;b++){
for(int a=b+1;a<=20;a++){
if((1.0/a+1.0/b+1.0/c+1.0/d)==1){
System.out.println(a+","+b+","+c+","+d);
break;
}
}
}
}
}
}
}
结果:
18,9,3,2
15,10,3,2
20,5,4,2
12,6,4,2
作者:
王明明
时间:
2012-6-17 00:25
看楼上的输出结果
由于不多于20人
那么
12 6 4 2
8 6 4 2
显然 这样是最接近的...
作者:
张頔
时间:
2012-6-17 00:58
郭宁 发表于 2012-6-16 22:54
搞不懂啊 我改成了两种形式
1
public class Demo{
public static void main(String[] args){
for(int a=20; a>=5;a-- )
for(int b=a-1; b>=4;b-- )
for(int c=b-1; c>=3;c-- )
for(int d=c-1; d>=2; d--){
if((1.0/a+1.0/b+1.0/c+1.0/d)==1){
System.out.println(a+":"+b+":"+c+":"+d);
break;
}
}
}
}
结果
20:5:4:2
18:9:3:2
15:10:3:2
12:6:4:2
2
public class Demo{
public static void main(String[] args){
for(int a=20; a>=5;a-- )
for(int b=--a; b>=4;b-- )
for(int c=--b; c>=3;c-- )
for(int d=--c; d>=2; d--){
if((1.0/a+1.0/b+1.0/c+1.0/d)==1){
System.out.println(a+":"+b+":"+c+":"+d);
break;
}
}
}
}
结果
15:10:3:2
???????
--a 和 a-1 运行结果不一样 可能是这个原因吧,但是我只知道a--和--a的不同 但是--a和a-1有什么不同这就不知道了 求大神
作者:
张頔
时间:
2012-6-17 01:08
晕了 刚才靠里这个问题考虑晕了 --a 和a-1 的结果虽然一样 但是 --a改变了a的值, a-1并不改变a的值{:soso_e106:}
作者:
张頔
时间:
2012-6-17 01:24
郭宁 发表于 2012-6-16 22:54
for(int d=--c; d>=2; --d){
if((1.0/a+1.0/b+1.0/c+1.0/d)==1){
System.out.println(a+":"+b+":"+c+":"+d);
break;
}
这个地方 之所以会出现重复是因为这样
for(int d=--c; d>=2; --d){
}
传过来的c其实是4 在进行d=--c之后变成了c变成了3 ,而这时b=--4=3
而这里的 --d是在运行完for循环里的程序的最后才减的
有因为巧合if判断语句正好成立所以就错误的输出了12:4:3:3
不知道回答的是否正确
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2