黑马程序员技术交流社区

标题: 关于看到的一个题 [打印本页]

作者: kamo    时间: 2015-10-18 15:29
标题: 关于看到的一个题
   题目:28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?
这个题,正确结果有人知道不?
   先谢过了。
作者: hyzhw    时间: 2015-10-18 16:06
19瓶。买18瓶就够26个人喝,但是多了2个瓶盖,另外在买一瓶,就是19瓶又多一瓶盖。3个瓶盖正好又可以兑换一瓶,这就是28瓶。
作者: jlq    时间: 2015-10-18 16:59
这是一个逻辑题吗
作者: 史世锋    时间: 2015-10-18 17:59
  1. public class Test011
  2. {

  3.         /**
  4.          *28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,
  5.      *那么要买多少瓶可乐,够28人喝?假如是50人,又需要买多少瓶可乐?(需写出分析思路)
  6.      *
  7.      *思路:1、定义三个变量,num、count、sum。
  8.      *       count用来记录瓶盖数
  9.      *       sum用来记录总共得到多少瓶可乐
  10.      *       num来记录买了多少瓶可乐,如果num<4,则需要买num瓶,
  11.      *     2、如果num>4,先买3瓶可乐,得到3个瓶盖,
  12.      *       可兑换1瓶可乐(判断sum == 人数),这时有1个瓶盖
  13.      *     3、再买1瓶(判断sum == 人数),可得到1个瓶盖,这时2个瓶盖
  14.      *     4、再买1瓶(判断sum == 人数),可得到1个瓶盖,这时3个瓶盖可兑换1瓶可乐(判断sum == 人数),兑换后这时1个瓶盖
  15.      *     5、再买1瓶(判断sum == 人数),可得到1个瓶盖,这时2个瓶盖
  16.      *     6、再买1瓶(判断sum == 人数),可得到1个瓶盖,这时3个瓶盖可兑换1瓶可乐(判断sum == 人数),兑换后这时1个瓶盖
  17.      *     .....
  18.          * @param args
  19.          */
  20.         public static void main(String[] args)
  21.         {
  22.                 int personNum = 50;
  23.                 int num = getNum(personNum);
  24.                 System.out.println(num);
  25.                 num = getNumMethod(personNum);
  26.                 System.out.println(num);
  27.         }
  28.         //获取需购买的瓶数
  29.         public static int getNum(int PersonNum)
  30.         {
  31.                 //如果人数少于4个人,则需要购买的瓶数就等于人数
  32.                 if(PersonNum < 4)
  33.                         return PersonNum;
  34.                
  35.                 //如果人数大于4,则先购买3瓶,定义三变量num、count、sun分别记录购买的可乐瓶数、瓶盖数、总共的可乐瓶数
  36.                 int num = 3, count = 3, sum = 3;
  37.                 for(int i = 0; sum != PersonNum; i++)
  38.                 {
  39.                         //瓶盖够3个就兑换一次
  40.                         if(count ==3)
  41.                         {
  42.                                 sum++;
  43.                                 count = 1;
  44.                                 continue;
  45.                         }
  46.                         num ++;
  47.                         count ++;
  48.                         sum ++;
  49.                 }
  50.                 return num;       
  51.         }
  52.         //也可以将for循环换成while循环
  53.         public static int getNumMethod(int PersonNum)
  54.         {
  55.                 //如果人数少于4个人,则需要购买的瓶数就等于人数
  56.                 if(PersonNum < 4)
  57.                         return PersonNum;
  58.                
  59.                 //如果人数大于4,则先购买3瓶,定义三变量num、count、sun分别记录购买的可乐瓶数、瓶盖数、总共的可乐瓶数
  60.                 int num = 3, count = 3, sum = 3;
  61.                 while(sum != PersonNum)
  62.                 {
  63.                         if(count ==3)
  64.                         {
  65.                                 sum++;
  66.                                 count = 1;
  67.                                 continue;
  68.                         }
  69.                         num ++;
  70.                         count ++;
  71.                         sum ++;
  72.                 }
  73.                 return num;       
  74.         }
  75. }
复制代码

作者: kamo    时间: 2015-10-18 18:17
hyzhw 发表于 2015-10-18 16:06
19瓶。买18瓶就够26个人喝,但是多了2个瓶盖,另外在买一瓶,就是19瓶又多一瓶盖。3个瓶盖正好又可以兑换一 ...

嗯,谢谢。
作者: kamo    时间: 2015-10-18 18:18
jlq 发表于 2015-10-18 16:59
这是一个逻辑题吗

是,不过可以编程,我是不确定答案,稍微看到了分歧,所以问问。
作者: kamo    时间: 2015-10-18 18:22
史世锋 发表于 2015-10-18 17:59

这么详细,谢谢啊,我也说说,我的思路吧,我是累加的,因为瓶数不会超过总人数我是分开了两个函数,一个是出结果,另一个是被调用的,功能是,当前瓶数能兑换多少瓶,这个函数的返回值加上当前递增的瓶数,若大于或等于人数,即可终止,返回瓶数。
作者: 朦胧色彩    时间: 2015-10-18 19:26
class Cola
{
        public static void main(String[] args)
        {
                int man = 28; // 一共28人
                int sum = 0;  // 目前几个瓶盖
                int num = 0;  // 多少瓶可乐
                while(man > 0)
                {
                        // 不够三个瓶盖
                        while(sum < 3)
                        {
                                num++;        // 买一瓶
                                man--;        // 少一个人
                                if(man==0) // 如果够了就跳出循环
                                        break;
                                sum++;        // 当前瓶盖个数
                                if(sum==3) // 如果当前瓶盖个数是3个,就少一个人,换一个瓶盖回来
                                {
                                        man--;
                                        if(man==0)
                                                break;
                                        sum=1;        // 3个瓶盖换一个
                                }
                        }
                }
                System.out.println(num); // 19
        }
}
作者: 斯文阿昊    时间: 2015-10-18 20:05
膜拜楼上两位大神
作者: 我若为神    时间: 2015-10-18 20:32
楼上两位的程序写的不错,这道题其实还可以用数学方法解决。设需要买x瓶可乐,则x+x/3+x/9+x/27+……>28,由等比求和公式一路化简为x>56/(3-1/3^n-1),最终算出x>56/3<,取整数为19,其中n为项数。
作者: QiChen    时间: 2015-10-18 20:40
楼上大神牛逼!我只能膜拜!
作者: 迷途老马    时间: 2015-10-18 20:47
666666666666666,学习了
作者: JYcainiao    时间: 2015-10-18 21:48
学习了   程序拿走了  慢慢看




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2