A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵倩倩 中级黑马   /  2012-6-16 22:24  /  2092 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。

    等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”

    请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。

评分

参与人数 1黑马币 +20 收起 理由
黄奕豪 + 20 不错的题目~~

查看全部评分

7 个回复

倒序浏览
本帖最后由 郭宁 于 2012-6-16 23:01 编辑

  1. /*
  2. * 分析:
  3. *                 1、船长拿起酒杯到挂了  喝了 一瓶。假设第一天到第四天的人数一次为  a、b、c、d
  4. *                        则船长每天喝  1/a + 1/b + 1/c +1/d == 1
  5. *                 
  6. *                 2、每天都有人 挂  所以今天 至少比昨天少一个人
  7. *                 
  8. *                 3、木有了
  9. * */


  10. public class Demo{
  11.         public static void main(String[] args){
  12.                 for(int a=20; a>=5; )
  13.                         for(int b=--a; b>=4; )
  14.                                 for(int c=--b; c>=3; )
  15.                                         for(int d=--c; d>=2; --d){
  16.                                                 if((1.0/a+1.0/b+1.0/c+1.0/d)==1){
  17.                                                         System.out.println(a+":"+b+":"+c+":"+d);
  18.                                                         break;
  19.                                                 }
  20.                                         }
  21.         }
  22. }


  23. 结果:
  24. 18:9:3:2
  25. 15:10:3:2
  26. 12:6:4:2
  27. 12:4:3:3

  28. 有个疑惑:为什么 会出现  12:4:3:3  带重复的?
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 李盼 于 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


评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
/*
* 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
回复 使用道具 举报
看楼上的输出结果
由于不多于20人
那么
12 6 4 2

8 6 4 2
显然 这样是最接近的...
回复 使用道具 举报
郭宁 发表于 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:17
7#
晕了 刚才靠里这个问题考虑晕了  --a 和a-1 的结果虽然一样  但是 --a改变了a的值, a-1并不改变a的值{:soso_e106:}
回复 使用道具 举报
张頔 中级黑马 2012-6-17 01:24:11
8#
郭宁 发表于 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
不知道回答的是否正确

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马