黑马程序员技术交流社区

标题: 一道入学考试题 看看你们的回答 [打印本页]

作者: -天然呆ノ    时间: 2014-9-30 19:32
标题: 一道入学考试题 看看你们的回答
28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?假如是50人,又需要买多少瓶可乐?(需写出分析思路)
我想看看你们的思路是什么样的

作者: 杨佳名    时间: 2014-9-30 20:05
  1. public class Demo {
  2.         public static void main(String[] args) {
  3.                 System.out.println(coke(28));
  4.                 System.out.println(coke(50));

  5.         }

  6.         public static int coke(int peopleNumber) {
  7.                 int buyCoke = 0; // 定义一个变量来存储买的可乐数
  8.                 int bottle = 0; // 定义一个变量来存储已有瓶盖数

  9.                 for (int i = 1; i <= peopleNumber; i++) {
  10.                         if (bottle < 3) {   //当瓶盖小于3时 买的可乐和瓶盖都加1
  11.                                 buyCoke++;
  12.                                 bottle++;
  13.                         } else {
  14.                                 bottle = 1; //当瓶盖等于3时,因为兑换可乐,所以瓶盖加1
  15.                         }
  16.                 }
  17.                 return buyCoke;
  18.         }
  19. }
复制代码

作者: 哈达洋    时间: 2014-9-30 21:07
本帖最后由 哈达洋 于 2014-9-30 21:08 编辑
  1. /*
  2. 思路:
  3. 1.买前3瓶,即产生3个瓶盖,可以兑换一瓶。产生一个新瓶盖。
  4. 2.以后每买两瓶,产生两个瓶盖,和之前的一个瓶盖又可兑换一瓶,依次类推。

  5. 总结:可以先忽略买的第1瓶,后面即可理解成买两瓶就送一瓶。代码如下:
  6. */

  7. class Coco
  8. {
  9.         public static void main(String[] args)
  10.         {
  11.                 int buy;//要买的瓶数(不算买的第1瓶)
  12.                 int change=0;//瓶盖换的
  13.                
  14.                 for(buy=1;(buy+change+1)<=28;buy++)//28人,50人时,相应改下就行。
  15.                 {
  16.                         change=buy/2;
  17.                 }
  18.                 System.out.println(buy+1);

  19.         }
  20. }
复制代码

作者: yangyujoe    时间: 2014-9-30 21:19
学习了。。。
作者: 郑飞    时间: 2014-9-30 22:09
  1. class Test{
  2.    
  3.     public static void main(String[] args){
  4.     hekele(28);
  5.     hekele(50);
  6.     }
  7.             public static void hekele(int man){

  8.                     int kele;//买的可乐数
  9.                     int gaizi ;//盖子数
  10.                     int people = 0;//喝到可乐的人数
  11.                     int change = 0;//换到的可乐数//

  12.                     for(kele=0,gaizi=0;people<man;kele++,gaizi++){
  13.                             while(gaizi>2){
  14.                             change = change + gaizi/3; //更新换到的可乐数
  15.                             gaizi =gaizi/3+ gaizi%3;  // 更新剩余盖子数
  16.                             }
  17.                             people = kele + change ;
  18.                             if(people==man){
  19.                             System.out.println("kele="+kele);
  20.                             }
  21.                     }
  22.             }
复制代码

作者: -天然呆ノ    时间: 2014-9-30 22:20
杨佳名 发表于 2014-9-30 20:05

兄弟 你这代码有点刚啊 开始没明白呢 后来明白了 思路不是正常人啊
作者: luofeng    时间: 2014-9-30 23:31
比较喜欢第一种思路的飘过。
作者: daoqin    时间: 2014-10-1 00:16
本帖最后由 daoqin 于 2014-10-1 00:18 编辑

可以当作规律题:
人数:   1   2   3   4   5   6   7  8   9  10   11   12   13   14   15   16
*            1   1   1   0   1   1   0   1   1   0    1      1     0     1    1      0
*      如果需要买就是1 ,0是表示3个瓶盖换了一瓶,并且多了一个盖子。
*      按上图规律即除去第一个人,后面都是每3人只需买2瓶,即3个人为一组,不满3人自己买。
        如果person=人数,buyBottle= 需要购买的瓶数,那么 bottle=((person-1)/3)*2+(person-1)%3+1


作者: 戏言丶    时间: 2014-10-1 00:47
楼上大神太多,我就不献丑了
作者: 杨佳名    时间: 2014-10-1 08:16
-天然呆ノ 发表于 2014-9-30 22:20
兄弟 你这代码有点刚啊 开始没明白呢 后来明白了 思路不是正常人啊

就是这样想的呢  分享下我的思路
作者: 不系之舟王    时间: 2014-10-1 08:55
学习了……
作者: yanghao    时间: 2014-10-8 10:04
本帖最后由 yanghao 于 2014-10-8 11:02 编辑

复制代码
。。。。。。。。。。。。。
作者: new999    时间: 2014-10-8 10:18
杨佳名 发表于 2014-9-30 20:05

这个思路好,简单直接
作者: 梦里听传说    时间: 2014-10-8 11:11
public class text01 {
/*
* 思路:定义一个while循环用来模拟购买
*                 定义一个变量cun用来记录按规定换来的可乐
*                 定义一个变量x用来记录买的可乐
*                 当cun+x等于给定的人数时结束循环  
*                 x当前值就是需要买的可乐数
*
* */
        public static void main(String[] args) {
                int person = 28;
                jisuan(3, person);
        }

        private static void jisuan(int i, int person) {
                int cun = 0;
                int x = 0;
                while (true) {
                        x++;
                        if (x % i == 0)
                                cun++;
                        if ((cun + x) == person)
                                break;
                }
                System.out.println(x);
        }

}

作者: 梦里听传说    时间: 2014-10-8 11:29
12楼说的方法最简单,直接数学运算,我现在后悔没学好数学了:L

/**
* 三瓶可以产生一瓶,所以把四瓶可乐看成一组,就是 人数/4 看看能否除尽, 除尽了,就用结果乘以3,
* 就是要买的瓶数,除不尽的余数就是还需要再买的瓶数
*/
public class text02 {
        public static void main(String[] args) {
                int person = 3569;
                int i = 3;
                jisuan(person, i);
        }

        private static void jisuan(int person, int i) {

                if (person % (i + 1) == 0)
                        System.out.println(person / (i + 1) * 3);
                else
                        System.out.println(((int) person / (i + 1)) * 3 + person % (i + 1));
        }

}

我给实现了下
作者: 李小强    时间: 2014-10-8 13:22
没看上面的答案,自己看了题目就埋头写了,不知道木有雷同的呢。好了,现在可以上去看看别人答案了^_^
  1. public class Test {

  2.         public static void main(String[] args) {
  3.                 // 题目:28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?假如是50人,又需要买多少瓶可乐?
  4.                 // 我的思路如下:
  5.                 // 1、首先,我先实现买n瓶可乐可以兑换回多少瓶
  6.                 int buyCokeCount = 20;
  7.                 System.out.println("买" + buyCokeCount + "瓶可换回" + exchangeableCount(buyCokeCount) + "瓶");

  8.                 //2、实现计算买n瓶总共能喝到多少瓶
  9.                 int total = buyCokeCount + exchangeableCount(buyCokeCount);

  10.                 // 感觉上面好像是个公式,假如total的值是28人,要求未知数 buyCokeCount是几?
  11.                 // -_-。sorry! 这个公式好像不可逆啊,知道买多少瓶可以返回总共得到多少瓶,但是知道总共是多少瓶,却无法反过来求买的是多少瓶,悲哀~>_<~+

  12.                 // 好吧,我想了个变态的想法,用暴力破解 ╭(′▽`)╯ (要是数额特别大,那运行可就慢了,不过现在的电脑配置都挺好,算个几十万人喝水的应该可以秒杀出结果)
  13.                 total = 28;
  14.                 System.out.println(total + "个人需要买" + needBuyCokeCount(total) + "瓶可乐才够喝");

  15.         }

  16.         /** 告诉我你买了几瓶可乐,我会告诉你能换回来多少瓶可乐 ^_^ */
  17.         public static int exchangeableCount(int cokeCount) {
  18.                 int exchangeableCount = cokeCount / 3;
  19.                 if (exchangeableCount >= 3) { // 如果兑换回来的大于3瓶,则又可以拿去兑换了^_^
  20.                         exchangeableCount += exchangeableCount(exchangeableCount);
  21.                 }
  22.                 return exchangeableCount;
  23.         }

  24.         /** 告诉我你有多少人,我会告诉你需要买多少瓶可乐 ^_^ */
  25.         public static int needBuyCokeCount(int total) {
  26.                 int buyCokeCount = 0;
  27.                 int tempTotal = 0;
  28.                 // 不断的增加购买瓶数,直到能得到的总瓶数和期望的值一样时就得出需要购买的瓶数,哎,跑的好累 ◑﹏◐
  29.                 while (true) {
  30.                         buyCokeCount++;       
  31.                         tempTotal = buyCokeCount;
  32.                         tempTotal += exchangeableCount(tempTotal);
  33.                         if (tempTotal >= total) {
  34.                                 return buyCokeCount;
  35.                         }
  36.                 }
  37.         }
  38. }
复制代码




作者: 李小强    时间: 2014-10-8 13:47
看了楼上的大侠们写的代码太强了,我的写的太差了,运行对比还发现我的代码有bug,修正如下:
  1. /** 告诉我你买了几瓶可乐,我会告诉你能换回来多少瓶可乐 ^_^ */
  2.         public static int exchangeableCount(int cokeCount) {
  3.                 int exchangeableCount = cokeCount / 3;        // 可兑换几瓶
  4.                 int modCount = cokeCount % 3;                        // 剩几个盖
  5.                 if (exchangeableCount + modCount >= 3) { // 如果兑换回来的大于3瓶,则又可以拿去兑换了^_^
  6.                         exchangeableCount += exchangeableCount(exchangeableCount + modCount);
  7.                 }
  8.                 return exchangeableCount;
  9.         }
复制代码

作者: 高泳    时间: 2014-10-8 13:59
看楼上各位大神来的
作者: 李小强    时间: 2014-10-8 14:11
楼上的都是神人也,给各大神跪了
作者: 迷失的小Z    时间: 2014-10-8 14:31
哈达洋 发表于 2014-9-30 21:07

好思路……
作者: 沈木生    时间: 2014-10-8 20:33
杨佳名 发表于 2014-9-30 20:05

不得不佩服。
作者: waylent    时间: 2014-10-8 21:15
  1. class Test{
  2.         public static void main(String[] args) {
  3.                 System.out.println(getBuyCount(28));
  4.                 System.out.println(getBuyCount(50));
  5.         }
  6.         /**
  7.         * number:the number of people that need Coca-Cola
  8.         */
  9.         public static int getBuyCount(int number){
  10.                 int buyCount=0;//the number of Coca-Cola that need to buy
  11.                 int bottleCap=0;//the number of caps of bottles of Coca-Cola
  12.                 int bottleCount=0;//the number of Coca-Cola that actually get
  13.                 while(bottleCount<number)
  14.                 {
  15.                         buyCount++;
  16.                         bottleCap++;
  17.                         if (bottleCap==3) {
  18.                                 bottleCap=0;
  19.                                 bottleCount++;
  20.                                 bottleCap++;
  21.                         }
  22.                         bottleCount++;
  23.                 }
  24.                 return buyCount;
  25.         }
  26. }
复制代码





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