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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?假如是50人,又需要买多少瓶可乐?(需写出分析思路)

会的大神万望赐教!

27 个回复

倒序浏览
  1. class Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int x = getBottles(28);
  6.                 int y = getBottles(50);
  7.                 System.out.println("28人:"+x+"----50人:"+y);
  8.         }

  9.         public static int getBottles(int num){ //定义一个获取瓶数的方法,接收人数
  10.                 int caps = 0; //定义一个变量记录当前瓶盖数
  11.                 int bots =0;  //定义一个变量记录当前的可乐数
  12.                 if(num<=3)
  13.                         return num;
  14.                 for(int i=num/2; i<=num; i++){  //从人数的一半开始遍历
  15.                         caps = i;
  16.                         bots = i;
  17.                         while(caps>=3){  //只要瓶盖数大于等于3就继续换
  18.                                 bots = bots+caps/3;   //可乐数= 当前可乐数 + 瓶盖换的
  19.                                 caps = caps/3+caps%3; //瓶盖数= 瓶盖换的可乐 + 换剩下的
  20.                         }
  21.                         if(bots>=num)
  22.                                 return i;
  23.                 }
  24.                 return 0;
  25.         }
  26. }
复制代码
回复 使用道具 举报
实际要买的可乐 = 总人数 - 总人数/4    (不算小数)
回复 使用道具 举报
沙发。。。。。。
回复 使用道具 举报
这是考递归的   while也能做,但是代码量大,而且不如递归给人的印象深.
  1. public class Test {
  2. /*
  3. 需求:
  4.         28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?假如是50人,又需要买多少瓶可乐?(需写出分析思路)
  5. 思路:
  6.         一看这种题,有返回值,有尽头又不知道要循环多少次的事,除了while循环,优先想递归.
  7.         getCola(num,cola)方法中,num是人数,cola是要买的可乐数.
  8.         最开始,人数是28,可乐数是0.
  9.         因为是递归,所以要写一个方法才能实现方法调用自身.
  10.        
  11.         当:num<=3时,也就是人数小于等3时,要买的可乐瓶数等人数,因为不能用3个瓶盖换.
  12.         当:num>3时,就可以用瓶盖换.
  13.                 这时考虑==>
  14.                                 1、每3个瓶盖可以换1瓶可乐,相当于,当可乐数每+3,人数都能-4.
  15.                                 2、可乐数就等于3加上剩余人数要买的可乐数.这句话用代码表示就是
  16.                                 num = num-4;
  17.                                 cola = 3+getCola(num,cola);
  18.         将上述思路整合,即得出代码.
  19.         50人同理.
  20. */
  21.         public static void main(String[] args) {
  22.                 int num = 4;
  23.                 int cola = getCola(num, 0);
  24.                 System.out.println(num+"人要至少买"+cola+"瓶可乐");
  25.         }

  26.         private static int getCola(int num, int cola) {
  27.                 if (num <= 3) {
  28.                         cola = cola + num;
  29.                         return cola;//这一句在num大于3的时候,每次递归都会调用到.
  30.                 } else {
  31.                         cola = 3 + getCola(num-4, cola);
  32.                         return cola;//这一句return才是程序最后返回结果的那一句.
  33.                 }
  34.         }
  35. }
复制代码
回复 使用道具 举报
呃...num最开始应该是28,不是4    4是我测试时候用的..没改过来...
回复 使用道具 举报
zz_job 中级黑马 2014-10-7 23:27:24
7#
if语句里的return的注释写得有点问题,应该说,如果把整个cola=... 这个表达式展开,if里的return应该出现在最后 的位置;else里的return返回各项相加的和,也就是最终结果。
当然  你按cola = cola+cola/4;算也行  但是这个不是计算机里的算法,是人脑的算法了
回复 使用道具 举报
紫狼 初级黑马 2014-10-8 00:43:58
8#
递归用的不错...
回复 使用道具 举报
楼主,看我用while秒杀各位大神,哈哈......
  1. package 入学测试;
  2. /*
  3. * 28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,
  4. * 那么要买多少瓶可乐,够28人喝?假如是50人,又需要买多少瓶可乐?(需写出分析思路)
  5. */
  6. import java.util.*;
  7. public class test_02Anvanced {

  8.         public static void main(String[] args) {
  9.                 // TODO Auto-generated method stub
  10.                 List<String> list=new ArrayList<String>();
  11.                 int people=28;     //在这里自定义人数
  12.                 int num=0;//瓶盖子
  13.                 int count=0;//我自己花钱买的可乐
  14.                 int extra_coca = 0;//用瓶盖子换的可乐
  15.                 while(list.size()<people)
  16.                 {
  17.                        
  18.                         list.add("coca");
  19.                        
  20.                         count++;  //只要我花钱买了可乐,可乐+1,瓶盖子+1
  21.                         num++;
  22.                         System.out.print("买第"+count+"瓶可乐!");
  23.                         if(num==3)//当瓶盖子达到三个是,集合中的可乐+1,但此时count并不+1,因为不是自己买的,是换的
  24.                         {
  25.                                 list.add("coca");
  26.                                 num=1; //因为3个瓶盖子换了一瓶可乐后,立马会有一个盖子
  27.                                 extra_coca++;
  28.                                 System.out.println("哇!用三个盖子换了一瓶可乐,一共有"+list.size()+"瓶可乐了");
  29.                         }
  30.                         System.out.println("现在手上有"+num+"个盖子!");
  31.                                
  32.                 }
  33.                 System.out.println("自己花钱买了"+count+"瓶可乐,用瓶盖子换了"+extra_coca+"瓶可乐!");
  34.         }

  35. }
复制代码



回复 使用道具 举报
本帖最后由 caixingke 于 2014-10-8 02:05 编辑

昨天也发了这道题给我.
我一开分析呢, 是从数据结构上来分析, 这是一棵完全三叉树.
但说实话, 二叉树的东西我都忘了不少, 所以也懒得去琢磨三叉树, 所以我换了个思路.
我喜欢用递归(递归本质是一个栈), 所以简单地用以下的几行代码简单解决:
  1. public static int buyBeverageNum(int numPerson){
  2.         if (numPerson<=3){
  3.                 return numPerson;
  4.         } else {
  5.                 return 2 + buyBeverageNum(numPerson-3);
  6.         }
  7. }
复制代码

呵呵, 里头只有一个if--else--判断, 其它都没有. 代码量超少.:lol

其思路是:
如果是3个人或3个以下的人买, 那么有多少人就买多少瓶;
即使如果有3个人, 还会再奖一瓶, 但是这一瓶退不回也没人要, 这3个人仍然还是要消费3瓶.

如果是超过3个人买, 我们把人分成多个3人组;
那么最前买的那3个人, 买了3瓶, 但会奖一瓶, 他们可以把这一瓶卖给后面的人.
即, 实际上, 这3个人, 只花了2瓶的钱.
而接下来的一组, 其会向前一组买一瓶, 再向店家买两瓶, 店家会奖一瓶, 他们把这一瓶卖给后一组,
即, 这一组, 总共也只花了2瓶的钱.
这样一组一组如此进行下去, 直到最后一组.
不管最后一组有没有3个人, 总之不会超过3个人, 即, 有多少人就买多少瓶.


这是一个简单的思路. 代码还要完善下, 比如添加一些代码, 判断下参数的合法化, 比如如果参数小于0, 那抛出异常之类.


回复 使用道具 举报
  1. public static int coke(int peopleNumber) {
  2.     int buyCoke = 0; // 定义一个变量来存储买的可乐数
  3.     int bottle = 0; // 定义一个变量来存储已有瓶盖数

  4.     for (int i = 1; i <= peopleNumber; i++) {
  5.             if (bottle < 3) {   //当瓶盖小于3时 买的可乐和瓶盖都加1
  6.                     buyCoke++;
  7.                     bottle++;
  8.             } else {
  9.                     bottle = 1; //当瓶盖等于3时,因为兑换可乐,所以瓶盖加1
  10.             }
  11.     }
  12.     return buyCoke;
  13. }
复制代码
觉着这样比较简洁。
回复 使用道具 举报
zz_job 发表于 2014-10-7 23:22
这是考递归的   while也能做,但是代码量大,而且不如递归给人的印象深.

很赞   
回复 使用道具 举报

恩恩,谢谢大神!
回复 使用道具 举报
zz_job 发表于 2014-10-7 23:22
这是考递归的   while也能做,但是代码量大,而且不如递归给人的印象深.

之前没有认真看递归,,,,谢谢!领教了!
回复 使用道具 举报
hollywood2014 发表于 2014-10-8 01:45
楼主,看我用while秒杀各位大神,哈哈......

高手啊!哪一期的??
回复 使用道具 举报
只写思路吗?
回复 使用道具 举报
杨佳名 发表于 2014-10-8 07:34
觉着这样比较简洁。

谢谢版主,明白了
回复 使用道具 举报
caixingke 发表于 2014-10-8 01:57
昨天也发了这道题给我.
我一开分析呢, 是从数据结构上来分析, 这是一棵完全三叉树.
但说实话, 二叉树的东 ...

递归代码要简洁不少
回复 使用道具 举报
public class ceshi {
        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));
        }

}
回复 使用道具 举报
不用递归也很简单4行代码解决,思路是:三瓶可以产生一瓶,所以把四瓶可乐看成一组,就是 人数/4 看看能否除尽, 除尽了,就用结果乘以3,就是要买的瓶数。
除不尽的话,拿商乘以3加上余数

现学现卖 4行代码解决问题
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马