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

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

会的大神万望赐教!

27 个回复

正序浏览
x564573138 来自手机 中级黑马 2014-10-9 18:02:27
28#
沙发。,。。。。
回复 使用道具 举报
好有趣的题目啊. :D
  1. public class Game
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 function(28);
  6.                 // ----------
  7.                 function(50);
  8.         }
  9.         public static void function(int p)
  10.         {
  11.                 int person = p; // 人数
  12.                 int cola = 0; // 买可乐
  13.                 int sum = 0; // 要买的可乐总数
  14.                 while (true)
  15.                 {
  16.                         if (person == 0)
  17.                         {
  18.                                 break;
  19.                         }
  20.                         else
  21.                         {
  22.                                 if (cola == 3)
  23.                                 {
  24.                                         person--;
  25.                                         cola = 1;// 换可乐又得一瓶盖.
  26.                                 }
  27.                                 else
  28.                                 {
  29.                                         cola++;
  30.                                         person--;
  31.                                         sum++;
  32.                                 }
  33.                         }
  34.                 }
  35.                 System.out.println(sum);
  36.         }
  37. }
复制代码
回复 使用道具 举报
  1. package com.itheima;

  2. * 思路:
  3. *   1、定义一个for循环,每一个人开始买可乐。
  4. *          2、因为买3瓶可乐可以兑换一瓶可乐,那么可以定义一个要买的可乐变量,如果可乐数量达到3瓶,那么这时候将可乐的数量重置为1,
  5. *                 否则的话,就将这次买可乐的次数用number变量记录下来。
  6. */
  7. public class Test10 {

  8.         public static void main(String[] args) {

  9.                 int number_1 = getNumber(28);
  10.                 System.out.println("28个人需要买:"+number_1+"瓶可乐");
  11.                
  12.                 int number_2 = getNumber(50);
  13.                 System.out.println("50个人需要买:"+number_2+"瓶可乐");
  14.         }

  15.         private static int getNumber(int persons) {
  16.                
  17.                 int cola = 0;        //要买的可口可乐
  18.                
  19.                 int number = 0;        //这是用来记录买可口可乐的次数
  20.                 for (int i = 0; i < persons; i++) {
  21.                
  22. //                        因为3瓶可乐可以兑换1瓶,所以如果可乐达到3瓶,那么将可乐数重置为1
  23.                         if (cola==3) {
  24.                                 cola = 1;
  25.                         } else {        // 否则,就将这次买可乐的次数,用number变量进行记录。
  26.                                 cola++;
  27.                                 number++;
  28.                         }       
  29.                 }
  30.                 return number;
  31.         }

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

精彩,谢谢
回复 使用道具 举报
这其实就像连锁反应,首先,第一个人买一瓶,喝完把盖子交给后面的人,然后反应开始了,之后每3个人只需要买两瓶就可以都喝到可乐,同时会多出来一个瓶盖,然后交给后面的人,一直反应到剩余人数不足3个,此时,剩余的人一人买一瓶就行了。于是,需要买的可乐瓶数是:1+((num-1)/3)*2+(num-1)%3.
当然之前有人发过帖子说向老板借瓶盖什么的,由于题目上没说可以借,所以就暂时不那么考虑了。
回复 使用道具 举报
用笔在纸上划一划,当做一个数学题,找到规律,相信你会!
回复 使用道具 举报
这是一道脑筋急转弯,3个人先分两瓶可乐,有两个瓶盖,再向老板买一瓶,就有了3个瓶盖,3瓶可乐,用这3个瓶盖来支付前面多买的那瓶可乐,那么正好没有剩余
(n/3)*2 + n%3
回复 使用道具 举报
费了一上午做出来了,私密我
回复 使用道具 举报
不用递归也很简单4行代码解决,思路是:三瓶可以产生一瓶,所以把四瓶可乐看成一组,就是 人数/4 看看能否除尽, 除尽了,就用结果乘以3,就是要买的瓶数。
除不尽的话,拿商乘以3加上余数

现学现卖 4行代码解决问题
回复 使用道具 举报
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));
        }

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

递归代码要简洁不少
回复 使用道具 举报
杨佳名 发表于 2014-10-8 07:34
觉着这样比较简洁。

谢谢版主,明白了
回复 使用道具 举报
只写思路吗?
回复 使用道具 举报
hollywood2014 发表于 2014-10-8 01:45
楼主,看我用while秒杀各位大神,哈哈......

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

之前没有认真看递归,,,,谢谢!领教了!
回复 使用道具 举报

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

很赞   
回复 使用道具 举报
  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. }
复制代码
觉着这样比较简洁。
回复 使用道具 举报
本帖最后由 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, 那抛出异常之类.


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