黑马程序员技术交流社区

标题: 28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝? [打印本页]

作者: bowen-xiao    时间: 2015-1-27 21:07
标题: 28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?
思路分析:
一、每次购买一瓶,达到可以兑换瓶盖的数量(即数量大于3)时;
二、进行一次循环兑换(在一个while(count>3));
三、兑换后可乐总数量与喝可乐人数是否相等,如果相等表示够喝了。

相信写到这里大家都会写这段代码了。
这是一道不算太难的算法题,但是需要一个小分析,
需要一点时间画一个图,这样开发起来就不会感觉难的了。
作者: sq_jun    时间: 2015-1-28 00:01
本帖最后由 sq_jun 于 2015-1-28 00:03 编辑
  1. public static void main(String [] args)
  2. {
  3.          int count =0,n=0;//count为买的可乐瓶数,n为买的和换的总瓶数
  4.                while (true) {   
  5.                    if(n%3==0)//每买3瓶可乐可以兑换1瓶,可乐总数+1
  6.                        n++;
  7.                        n++;   //每次循环总数加1
  8.                    count++;   //每次循环买的瓶数加1
  9.                   
  10.                    if(n>=28)//当达到28瓶就跳出
  11.                        break;
  12.         
  13.     }
  14.                System.out.println(count);//打印买的可乐瓶数

  15. }
复制代码

作者: lpf870826    时间: 2015-1-28 10:26
思路:  我觉的还是这样好理解一点
* 方法一: 3个瓶盖可以换一瓶,那么相当于3人只需要两瓶就够了。
* 但要考虑不能先喝可乐在换瓶盖的情况,这样就可以先假设每个人一瓶,
* 再减去每3个人多买的一瓶,但这样总人数要减去一个。
* <p/>
* 方法二: 除去第一个人,后边的人每3人为一组,不够3人为最后一组,
* 如果最后一组为三人,就相当于,每组只需买两瓶就够,连个瓶盖加上
* 上一人留下的瓶盖就可以换得一瓶,并 把瓶盖留给下一组使用。如果
* 最后一组少于3人,则每人需买一瓶。
*
*/
public class Test10 {

    public static void main(String[] args) {

        method_1(28);
        method_1(50);
        method_2(28);
        method_2(50);
    }

    public static void method_1(int peopleNumbers) {
        /**
         * “(peopleNumbers-1)/3”:除去第一个人后,没够3人就减去
         */
        int colaNumbers = peopleNumbers - (peopleNumbers - 1) / 3;
        System.out.println("方法一:" + peopleNumbers + "人需要买" + colaNumbers + "瓶可乐。");
    }

    public static void method_2(int peopleNumbers) {
        /**
         * “1”:为第一个人买的数量。
         * “((peopleNumbers-1)/3)*2”:为除去第一个人,人数够3人小组需买的数量。
         * “(peopleNumbers-1)%3”:为除去第一个人,人数不够3人的小组需买的数量。
         */
        int colaNumbers = 1 + ((peopleNumbers - 1) / 3) * 2 + (peopleNumbers - 1) % 3;
        System.out.println("方法二:" + peopleNumbers + "人需要买" + colaNumbers + "瓶可乐。");
    }
}


作者: bowen-xiao    时间: 2015-1-28 16:04
sq_jun 发表于 2015-1-28 00:01

这个题做得不错,但是还有一个小问题,兑换后的那瓶汽水是不是也有一个瓶盖,是不是得加上去呢?
作者: bowen-xiao    时间: 2015-1-28 16:14
lpf870826 发表于 2015-1-28 10:26
思路:  我觉的还是这样好理解一点
* 方法一: 3个瓶盖可以换一瓶,那么相当于3人只需要两瓶就够了。
*  ...

这两个算法就牛B了感觉数学成份多一点,哥们你不会是搞大数据的吧!
作者: fanshuai    时间: 2015-1-28 19:57
bowen-xiao 发表于 2015-1-28 16:04
这个题做得不错,但是还有一个小问题,兑换后的那瓶汽水是不是也有一个瓶盖,是不是得加上去呢? ...

可以和老板商量,等喝完了再把盖给他。;P
作者: 20150102    时间: 2015-1-28 21:16
心算后感觉要买19瓶不知道是不是

作者: lpf870826    时间: 2015-1-28 21:34
bowen-xiao 发表于 2015-1-28 16:14
这两个算法就牛B了感觉数学成份多一点,哥们你不会是搞大数据的吧!

我其实是觉的这个简单,好记,呵呵,其实也是看别人的
作者: jwl245322883    时间: 2015-1-28 21:38
呵呵路过来看看,蛮好玩的
作者: 18942668193    时间: 2015-1-28 21:41
恩是蛮好玩的

作者: 礼礼小跑    时间: 2015-1-28 22:50
本帖最后由 礼礼小跑 于 2015-1-28 22:52 编辑

这种算法题不错!
作者: gzy    时间: 2015-1-28 22:54
路过来学习学习               
作者: sq_jun    时间: 2015-1-28 23:36
bowen-xiao 发表于 2015-1-28 16:04
这个题做得不错,但是还有一个小问题,兑换后的那瓶汽水是不是也有一个瓶盖,是不是得加上去呢? ...

加到总数里面了啊
作者: fightingwang    时间: 2015-1-29 01:11
飘过,顶一下
作者: 天堂雨    时间: 2015-1-29 10:46
二楼正解~~
作者: 风魂    时间: 2015-1-29 13:31
赞!!!!
作者: lwh316658735    时间: 2015-1-29 15:12
总结的公式    return (n%3==0)?(n-n/3+1) : (n-n/3)
作者: 佟金    时间: 2015-3-15 22:23
  1. public static void main(String[] args)
  2.         {       
  3.                 //声明接收设备,接受数据
  4.                 System.out.println("请输入人数:");
  5.                 Scanner scanner = new Scanner(System.in);
  6.                 int i = scanner.nextInt();
  7.                 //调用计算方法
  8.                 int num = methord(i);
  9.                 System.out.println(i+"个人最少需要买"+num+"瓶饮料");
  10.         }
  11.         public static int methord(int i)
  12.         {
  13.                 int a = 1;//用来循环/3,%3,的过程
  14.                 int b = 0;//用来记录共喝了多少瓶
  15.                 int c = 0;//用来记录a的原始值
  16.                 while(true)//a从1开始不断自增,当满足人数时,返回该值
  17.                 {
  18.                         c = a;
  19.                         b = 0;//每次循环对b值进行还原。
  20.                         b += a;
  21.                         while(a/3>0)
  22.                         {
  23.                                 b +=a /3;//瓶盖换的汽水数
  24.                                 a = a/3+a%3;//换完后剩余的瓶盖数
  25.                         }
  26.                         //if(a%3==2)当可以先喝汽水再用三个瓶盖换时,加入这两步
  27.                                 //b++;
  28.                         if(b>=i)
  29.                                 return c;
  30.                         else
  31.                                 a = c+1;
  32.                 }
  33.         }
复制代码

我的方法。。。。。。。
作者: thoris    时间: 2015-3-15 22:52
lpf870826 发表于 2015-1-28 10:26
思路:  我觉的还是这样好理解一点
* 方法一: 3个瓶盖可以换一瓶,那么相当于3人只需要两瓶就够了。
*  ...

这个思路好~
作者: djbcool    时间: 2015-3-17 11:29
其实很简单,不用想那么复杂
作者: djbcool    时间: 2015-3-17 11:32
  1. public class Test10 {
  2.         public static void main(String[] args) {
  3.                 int people = 19;
  4.                 int cap = 0;
  5.                 int buy = 0;
  6.                
  7.                 for (int person = 1; person <= people; person ++) {
  8.                         if (cap < 3) {
  9.                                 buy ++;
  10.                                 cap ++;
  11.                         }
  12.                         if (cap == 3) {
  13.                                 cap = 0;
  14.                                 // 只要有 3 个瓶盖,就可以少买 1 次
  15.                                 buy --;
  16.                         }
  17.                 }
  18.                 System.out.println(buy);
  19.         }
  20. }
复制代码

作者: longlongint    时间: 2015-3-17 11:53
学习学习
作者: 谢鸿    时间: 2015-3-17 12:08
不错!

作者: 高光天    时间: 2015-3-17 13:51
lpf870826 发表于 2015-1-28 10:26
思路:  我觉的还是这样好理解一点
* 方法一: 3个瓶盖可以换一瓶,那么相当于3人只需要两瓶就够了。
*  ...

我也是这么干的
作者: Johnny_Hu    时间: 2015-4-30 20:51
sq_jun 发表于 2015-1-28 00:01

if(n>28)
这里不能大于等于28

因为已经等于28了 说明每个都已经有一瓶可乐了  就不能再执行了  
你把28改成50就有bug了
作者: Johnny_Hu    时间: 2015-4-30 21:11
20150102 发表于 2015-1-28 21:16
心算后感觉要买19瓶不知道是不是
  1. public class Test11 {
  2.         /*
  3.          * 28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?
  4.          * 假如是50人,又需要买多少瓶可乐?
  5.          */
  6.         public static void main(String[] args)
  7.         {
  8.                 coke(28);               
  9.         }
  10.         public static void coke(int personNum)
  11.         {        //用于计算兑换的可乐瓶数
  12.                 int count = 0;
  13.                 //总共要购买的可乐数
  14.                 int num = 0;
  15.                 //兑换的可乐跟需要买可乐的数量
  16.                 int sum = 0;
  17.                 while(true)
  18.                 {
  19.                         if(sum != personNum)
  20.                         {
  21.                                 num++;
  22.                                 if(num % 3 == 0)
  23.                                 {
  24.                                         count++;
  25.                                 }
  26.                                 sum = num + count;       
  27.                         }                                       
  28.                         else
  29.                         {                               
  30.                                 break;
  31.                         }
  32.                 }
  33.                 System.out.println(count+"+"+num);
  34.         }
  35. }
复制代码


我算出来是 50人 买38瓶 送12瓶
28人是 买21瓶 送7瓶
作者: wangaz    时间: 2015-6-1 22:17
* 分析思路:1、因为每买两瓶可乐,就意味着够三个人喝的了;
*                   2、通过while循环来记录需要买的可乐瓶数(即循环次数),同时用count来记录每次循环后真正有多少可乐可喝,
*                         判断条件为count小于喝可乐的人数;
*                   3、循环内部设计:每次循环count都先加1,如果碰到被2整除的循环次数多加一次1,用i来标记循环次数,所以每次循环加1,
*                          但因为i从1开始,所以最后真正的循环次数为i-1,这里的设计是为了避免i==0时count会错误加1的情况;
*                   4、根据分析思路去规范代码。
作者: Tangtang    时间: 2015-6-8 17:39
sq_jun 发表于 2015-1-28 00:01

RE:你写的代码还是不怎么准确,当你有7个人的时候,结果显示是购买5瓶。那么问题来了,买5瓶只够兑换一瓶,也就是5+1才6瓶,7个人明显不够嘛
作者: VIP1108210117    时间: 2015-6-15 22:23
sq_jun 发表于 2015-1-28 00:01

当n=0时n%3=0,调整顺序才行:lol
作者: lanbo    时间: 2015-6-18 12:16
分析:三个盖子等于一个盖子加一个可乐瓶
* 那么两个盖子就等于一瓶可乐。也就说想和三瓶可乐,买两瓶就行,可以买两瓶
* 可乐以后,借老板一瓶,然后将三个瓶盖当做一瓶还给老板,这样如果要喝的人数x
* 是三的倍数时n=x/3*2就是需要买的可乐数,如果不是三的倍数,剩余一人,
* 则再另外买一瓶,剩余两人,则再买两瓶。
* 公式:return (n%3==0)?(n/3*2) : ((n%3==1)?(n/3+1):(n/3+2));
public class Test10 {

        public static void main(String[] args) {
                int n=28;//需要和可乐的人数
        //  int n=50;
                int x;//需要买的可乐数
                x=method(n);
                System.out.println(x);
        }
        public static int method(int n) {
          return (n%3==0)?(n/3*2) : ((n%3==1)?(n/3*2+1):(n/3*2+2));       
        }
}
作者: lanbo    时间: 2015-6-18 12:18
笑脸的地方应该是冒号,请大家看一下
作者: 行意天下    时间: 2015-6-18 18:47
最近为了笔试,想了一下这个题,见我博客:http://4259297.blog.51cto.com/4249297/1663206
如果用数学方法写代码太没有意思了,用多线程写起来我感觉比较爽。
作者: 铿锵的小黑马    时间: 2015-8-12 21:09
  表示不是太难 ...
作者: haocds3015    时间: 2015-11-2 22:00
大神们这样是不对的
作者: haocds3015    时间: 2015-11-2 22:11
大家都知道斐波那契吧
这个其实就是递归调用
在超过三瓶的时候继续调用方法本身
就知道结果了
作者: 罗志凯    时间: 2015-11-3 22:35
先用数学解题思想进行解答,然后用程序代替
作者: 云在青天    时间: 2015-11-28 10:46
谢谢分享  膜拜大神
作者: LLLLL    时间: 2015-12-2 17:32
6666666666666666666666
作者: xiaojunru    时间: 2016-3-14 22:24
还是不会啊
作者: xiaojunru    时间: 2016-3-15 11:18
还是觉得很难
作者: 地球人    时间: 2016-3-15 12:46
lwh316658735 发表于 2015-1-29 15:12
总结的公式    return (n%3==0)?(n-n/3+1) : (n-n/3)

很厉害,不知道你是怎么想的,是先拿出一瓶再三瓶一组的考虑,然后只是在公式上变了一下;还是直接就从三瓶一组考虑的.求思路
作者: 蔡恒    时间: 2016-3-17 19:11
来看看!
作者: 怪人长    时间: 2016-3-18 12:42
本帖最后由 怪人长 于 2016-3-18 12:45 编辑

分析:
         * 1.变量的分析:若一次购买一瓶可乐,则购买次数即购买可乐的瓶数,记为 count;
         *                          因为一人一瓶可乐,所以手里剩下的可乐数即够喝的人数,记为  p;
         *                         还有一个关键变量,即瓶盖的数量,记为  k;
         * 2.过程的分析:假设我们一瓶一瓶的不停的购买可乐,每次购买计数增加1,当拥有3个瓶盖时,满足条件兑一瓶可乐(注意                                    兑的这一瓶也是有瓶盖的),
         *                         继续购买可乐,再次拥有3个瓶盖时,又满足条件再去兑一瓶,如此下去一直到可乐数量够28个的时候就停止
                                    购买。
         * 3.条件的分析:每次购买一瓶可乐当做循环一次,count+1,当满足兑换条件时,即当瓶盖 k=3 时,兑换一瓶可乐,这时候
                                    k重置为1,可乐数量p+1,然后继续循环,直到可乐数量 p=28,跳出循环;
  1. public class Demo {
  2.         public static void main(String[] args) {
  3.                 int count = 0;                        // 总共买的可乐数
  4.                 int p = 0;                                // 够喝的人数
  5.                 int k = 0;                                // 瓶盖数
  6.                
  7.                 do {                                        //用循环模拟买可乐的过程
  8.                         count++;
  9.                         p++;                                //够喝的人数增加1
  10.                         k++;                                //可乐数增加1
  11.                         if (k == 3 ) {                //判断,有三个瓶盖的话就去换一瓶可乐!
  12.                                 p++;                        //可乐数增加1
  13.                                 k = 1;                        //瓶盖数变为1
  14.                         }
  15.                 }while(p < 28);//可乐数达到要求的话就跳出循环
  16.                 System.out.println("够28人喝需要买的可乐瓶数为:" + count);
  17.         }
  18. }
复制代码





作者: liuhongbo    时间: 2016-3-18 15:39
涨姿势了 这样算也行啊
作者: 青争心    时间: 2016-4-3 19:30
20150102 发表于 2015-1-28 21:16
心算后感觉要买19瓶不知道是不是

21
hgjgjhil
作者: ZZT    时间: 2016-5-11 21:22

作者: SQQ    时间: 2016-6-10 18:18
谢谢分享
作者: 吃素的老虎    时间: 2016-7-1 22:37
厉害啊!高手真多!
作者: liusonglin    时间: 2016-8-1 13:11
可以借:
return (n/3*2+n%3);

return (n-n/3);
注:第二个式子不能写成 2*n/3

不能借:
43楼的代码体现(这个思想比其他人的更容易理解,非常赞!)
作者: 68帅锅    时间: 2016-8-21 15:51
唉,我算术不好,英语不好,是不是就学不会编程了.....唉,算了,我还是回家种田吧
作者: suming    时间: 2016-8-31 00:07
这个 棒棒的
作者: 梁古叔广    时间: 2016-10-11 23:29
我这个思路应该最简单易懂了

欢迎指正
import java.util.Scanner;

public class Test_MaiKeLe {

        /**10--28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?假如是50人,又需要买多少瓶可乐?
         * @param args
         */
        public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);
                System.out.println("请输入人数");
                //人数
                int personNum = sc .nextInt();
                //可乐总数
                int keLe=0;
                //瓶盖数
                int gai =0;
                //买的可乐数
                int mai = 0;
                //当可乐总数比人数少就买一瓶,循环一次,买一瓶可乐总数就增加一瓶
                for (keLe =0 ; keLe < personNum; keLe++) {
                        //买一次,买的可乐就增加一瓶
                        mai++;
                        //盖子增加一个
                        gai++;
                        //当盖子到3个
                        if(gai==3){
                                //我换一瓶可乐
                                keLe++;
                                //三个瓶盖换一瓶可乐之后,手上有一个瓶盖
                                gai=1;
                        }
                }
                System.out.println("需要购买可乐"+mai+"瓶");

        }

}
作者: guyouzhong    时间: 2017-1-27 14:49
sq_jun 发表于 2015-1-28 23:36
加到总数里面了啊

刚开始进入while循环的时候,n++是什么鬼





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