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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 无此姓名 于 2014-4-13 19:14 编辑
  1. <p>package com.itheima;

  2. public class Test10 {

  3.         /**
  4.          * 28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?假如是50人,又需要买多少瓶可乐?
  5.          */
  6.         public static void main(String[] args) {
  7.                 System.out.println(getCocaNum(28));                //28人需要买19瓶可乐
  8.                 System.out.println(getCocaNum(50));                //50人需要买34瓶可乐
  9.         }
  10.         
  11.         /*
  12.          * 思路:
  13.          *         递增要买可乐的数量,每递增一次,算出总共能换多少瓶可乐,
  14.          *         当可乐的总数量大于等于人数时,返回当前买可乐的数量
  15.          * */
  16.         public static int getCocaNum(int personNum)
  17.         {
  18.                 int cocaToBuy=0,cap,cocaCount;//定义三个变量,代表要买的可乐数量,每次换后剩余瓶盖数量,当前可乐总数量
  19.                 while(true){        
  20.                         ++cocaToBuy;       //开始要买的可乐数量增加一个        
  21.                         cocaCount=cocaToBuy; //换之前可乐的数量
  22.                         cap=cocaToBuy;            //将瓶盖取下,换之前瓶盖的数量=开始买的可乐的数量
  23.                         
  24.                         //在while循环里换可乐,并计算出总共能得到的可乐数量cocaCount
  25.                         while(cap>=3){     //当瓶盖数量小于3时,不可再换,跳出。
  26.                                 cocaCount=cap/3+cocaCount; //换一次,可乐数量增加。</p><p>                                cap=(cap/3+cap%3);   //还剩多少瓶盖呢?
  27.                                 if(cocaCount>=personNum) //判断是否够每人一瓶,
  28.                                         return cocaToBuy;  //返回需要买的可乐数量
  29.                         }
  30.                 }
  31.         }
  32. }
  33. </p>
复制代码


感觉这题很有意思,大家都是怎么写的

50 个回复

倒序浏览
  1. package com.itheima;

  2. /**
  3. * 第十题:28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?假如是50人,又需要买多少瓶可乐?(需写出分析思路)
  4. *
  5. *        思路:
  6. *        首先是运算关系,1个可乐就能获得1个瓶盖,3个瓶盖又能获得1个可乐,兑换获得1个可乐的同时又获得了1个瓶盖
  7. *        如果可乐不够人喝,那么就一直加1瓶可乐,直到可乐和兑换到的可乐数大于或等于人数就停止购买。
  8. *        再使用递归运算,直到购买数+兑换数大于等于人数就返回购买了多少瓶可乐
  9. */
  10. public class Test10 {

  11.         private static int COLE = 1;                //购买的可乐数
  12.         private static int EXCHANGE = 0;        //兑换的可乐数
  13.         private static int CAP = 1;                        //当前拥有的瓶盖数
  14.        
  15.         public static int getCole(int peoples) {
  16.                

  17.                 System.out.println("买了可乐:"+COLE +"\t兑换了可乐"+EXCHANGE+"\t当前瓶盖"+ CAP);
  18.                
  19.                 if(COLE + EXCHANGE  < peoples){                //如果可乐不够喝,那么就继续买
  20.                        
  21.                         COLE = COLE + 1;                //再买一个可乐
  22.                         CAP = CAP + 1 ;
  23.                        
  24.                         EXCHANGE  =EXCHANGE + CAP / 3;                //兑换可乐数=当前已兑换的可乐+现有瓶盖的兑换数
  25.                         CAP = (CAP / 3)+(CAP %3);                //当前瓶盖数=兑换了可乐余下的瓶盖+兑换的可乐会产生的瓶盖
  26.                        
  27.                         getCole(peoples);                //递归调用
  28.                 }
  29.                
  30.                 return COLE;
  31.                
  32.         }
  33.        
  34.         public static void main(String[] args) {
  35.                
  36.                 int cole = Test10.getCole(28);
  37.                
  38.                 System.out.println("买的cole数:"+cole);
  39.                
  40.         }

  41. }
复制代码
回复 使用道具 举报 1 0
  1. class Cola{
  2.         public int fun1(int noColaPerson){//定义返回可乐瓶数的方法导入参数需要喝可乐的人,暴力购买法
  3.                 int cap=0;//定义瓶盖
  4.                 int ColaMunber=0;//定义买可乐的数量
  5.                 while(noColaPerson>0){//假如还有人没有可乐
  6.                         ColaMunber++;//买一瓶可乐,购买可乐的瓶数加1
  7.                         noColaPerson--;//又有一个人喝上了可乐
  8.                         cap++;//瓶盖数量加1
  9.                         if(cap==3){//如果瓶盖够三个了
  10.                                 cap=1;//瓶盖数量回到1
  11.                                 noColaPerson--;//又有一个人喝上了可乐
  12.                         }
  13.                 }
  14.                 return ColaMunber;//返回购买可乐的瓶数
  15.         }
  16.         public int fun2(int noColaPerson){//数学方法
  17.                 double ColaMunber=noColaPerson*2/3+1;
  18.                 return (int) ColaMunber;
  19.         }
  20. }
  21. public class Test10{//编写测试类
  22.         public static void main(String[] args){
  23.                 Cola cola=new Cola();
  24.                 System.out.println(cola.fun1(28)+"瓶");//测试28个人
  25.                 System.out.println(cola.fun2(50)+"瓶");//测试50个人
  26.         }        
  27. }
复制代码


回复 使用道具 举报 1 0

能解释一下数学方法吗
回复 使用道具 举报
大家都好强啊   有推荐的书籍吗?
回复 使用道具 举报
无此姓名 发表于 2014-4-14 02:00
能解释一下数学方法吗

∵3盖=1盖+1可乐
∴2盖=1可乐
X=购买数量=初始瓶盖数=初始可乐数
于是X+X/2>=28
∴X>=28*2/3
∵X为整数
∴X=28*2/3向上取整,向上取整有更优化的办法,我没弄,直接+1了,+1会出现不剩瓶盖的前提下多买一瓶。
回复 使用道具 举报 1 0
本帖最后由 杨庆雷 于 2014-4-14 10:21 编辑

如果 用空瓶子换饮料喝  那么两个空瓶子就能会多出一瓶饮料(原本有两个瓶子,向老板借一瓶饮料,喝完刚好三个空瓶子,一起给老板,刚好三个空瓶子换一瓶饮料),假设我们买了n品饮料够多少人喝呢  x(人数)=int(n/2+n)
代码:   只需这么几行           public static int method(int n){  //此处x为需要喝饮料的人数
                                                x=int((2/3)*n) +1  ;                                                                                                                     return  x;
                                           }

当 n = 28时   x = int(56/3)+1 = 19
当 n = 50时   x = int(100/3)+1 = 34



回复 使用道具 举报
lwy0319 发表于 2014-4-14 08:38
∵3盖=1盖+1可乐
∴2盖=1可乐
X=购买数量=初始瓶盖数=初始可乐数

这个太强了
回复 使用道具 举报

思考问题的方向不同而已。。毕竟来自经典的逻辑问题。。
回复 使用道具 举报
Union 高级黑马 2014-4-17 23:24:05
10#
学习了!
回复 使用道具 举报
学习学习!
回复 使用道具 举报
  1. /**
  2. 此程序用以实现可乐问题:n个人去喝可乐,三个瓶盖可以换一瓶可乐,要买多少瓶?
  3. */
  4. import java.util.*;

  5. class KeLe
  6. {
  7.         public static void main(String[] args)
  8.         {
  9.                 int renShu;                                                                                        //设定人数变量;
  10.                 Scanner in = new Scanner(System.in);
  11.                 System.out.println("请输入人数:");
  12.                 renShu = in.nextInt();
  13.                 int keLe = 0,pingGai = 0,gouMai = 0;                                //三个变量分别统计可乐数、瓶盖数和购买数;
  14.                 while(keLe!=renShu)
  15.                 {
  16.                         //以下if语句块,实现瓶盖换可乐,瓶盖达到3个以后,换到一瓶可乐,瓶盖数也变成1;而购买数不变。
  17.                         if(pingGai==3)                                                                       
  18.                         {
  19.                                 keLe++;
  20.                                 pingGai = 1;
  21.                         }
  22.                         gouMai++;                                                                                //买可乐;
  23.                         keLe++;                                                                                        //买完可乐后,可乐数+1;
  24.                         pingGai++;                                                                                //瓶盖数也+1;       
  25.                        
  26.                 }
  27.                 System.out.println("共要买可乐"+gouMai+"瓶!");
  28.         }
  29. }
复制代码
回复 使用道具 举报
才做完这个题..
* 28个人连续买可乐,每瓶可乐产生一个瓶盖
         * 每个人在买可乐之前都判断现有瓶盖是否满足3个,如果满足 则换购一瓶,不需要买,
         * 然后将瓶盖数置为1(因为没三个瓶盖就能换购一瓶,所以瓶盖数最多为3,然后换购的可乐又产生一个瓶盖),
         * 如果不满足则买一瓶可乐,然后瓶盖数+1;
         * */
        public static void main(String[] args) {
                System.out.println(coke(28));//28人需要买29瓶
                System.out.println(coke(50));//50人需要买34瓶

        }
        public static int coke(int peopleNumber)
        {
                int buyCoke = 0; //定义一个变量来存储买的可乐数
                int bottle = 0; //定义一个变量来存储已有瓶盖数
               
                for(int i = 1 ; i <= peopleNumber ; i++)
                {
                        if(bottle<3)
                        {
                                buyCoke++;//3
                                bottle++;//
                        }
                        else
                        {
                                bottle=1;  //满足瓶盖等于3后,就换购一瓶可乐,然后又产生一个瓶盖
                        }       
                }
                return buyCoke;
回复 使用道具 举报 1 0
杨庆雷 发表于 2014-4-14 10:10
如果 用空瓶子换饮料喝  那么两个空瓶子就能会多出一瓶饮料(原本有两个瓶子,向老板借一瓶饮料,喝完刚好三个 ...

你这思想做不对吧, 你这个就可以等同于 3个人一组,一组只用买两瓶, 需要的瓶数就是 (人数/3)*2+人数%3;
   当有30个人的时候 你这个只需要买20瓶
  但是题目来说 需要21瓶
回复 使用道具 举报 0 1

太赞了,代码简单而且好理解
回复 使用道具 举报
谢谢你的帖子。
回复 使用道具 举报

你的方法最好理解
回复 使用道具 举报
lwy0319 发表于 2014-4-14 08:38
∵3盖=1盖+1可乐
∴2盖=1可乐
X=购买数量=初始瓶盖数=初始可乐数

很吊,两个方法都看懂了
回复 使用道具 举报
好强悍  楼上的
回复 使用道具 举报
谢谢分享。。
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马