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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Afridoce 高级黑马   /  2014-12-23 21:57  /  1345 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

~~~~多少人买可乐都没问题~~~~
package com.itheima;
/**
* 第10题 :28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,
* 那么要买多少瓶可乐,够28人喝?假如是50人,
* 又需要买多少瓶可乐?(需写出分析思路)
*
* @author Administrator
*/

/*思路:
* 可乐是一瓶一瓶增加的,瓶盖也是跟着可乐增加,
* 但是3个瓶盖可以兑换一瓶可乐,
* 兑换的可乐每3个盖子又可以兑换一瓶可乐,
* 也就是说每3瓶多1瓶,
* 在上面的基础上,每9瓶可以再多兑换1瓶,
* 在上面的基础上,每买27瓶可以再多兑换一瓶,
* 以此类推。
* 当购买的可乐和兑换的可乐等于总人数时,输出购买的可乐瓶数,
* 程序结束。
* */
public class Test10
{
        public static void main(String[] args)
        {
                buyCoke(28);  //28个人买可乐
                buyCoke(50);  //50个人买可乐
        }
        public static void buyCoke(int people)
        {
                int coke = 0;
                int cap = 0;
                int num = 0;
                while(num<people)
                {
                        //每次买一瓶
                        coke++;  
                        //计算兑换的可乐数
                        for(int x = 3;x<=coke;x*=3)
                         {
                                 if(coke%x==0)
                                 {
                                         cap++;
                                 }
                        }
                        //可乐总数
                        num = coke+cap;
                }
                System.out.println(people+"人需要买"+coke+"瓶才够喝");
        }
}
结果是:20 和 35

13 个回复

倒序浏览
本帖最后由 奋斗的蜗牛ksd 于 2014-12-24 00:05 编辑

错了吧,买3瓶  多 的是 一瓶可乐 和一个瓶盖
买九瓶 是9个瓶盖 和9瓶可乐,  9个瓶盖能换3个可乐。
我是这么想的,也不确定答案。

---------------------------------------------------分割线------------------------------------------------
-------------------------------------两种解释,两种答案,但楼主答案90%错的------------------------
我的思路是建立在 一次性买,一次性兑换上的
按我的思路代码是这样的
原创思路:当小学数学题来做
* 设 可乐数为x,人数为y
*  x/3+x=28=y  x=21哈哈
*  x/3+x=50  
28人要21瓶,50人要38瓶


  1. <p>public class TestCola {

  2.         public static void main(String[] args) {
  3.                 // TODO Auto-generated method stub
  4.                 int num=50;
  5.                 System.out.println(buy(num));
  6.         }
  7.         
  8.         public static int buy(int num)
  9.         {
  10.                 int b=0;
  11.                 for(int x=1;x<num;x++)
  12.                 {
  13.                         b=x/3+x;
  14.                         if(b>=num)
  15.                                 return x;
  16.                 }
  17.                 return  b;
  18.                
  19.         }

  20. }</p><p> </p>
复制代码


----------------------------------分割线,按你的思路-----------------------------------
然而第二种思路是 买一次 兑换一次,但是你思路有问题,答案是错的
数学推理方法【参考了前辈的推导,非原创。】,下楼有本种方法的详细测试,演示了每一步的运行。
∵3盖=1盖+1可乐
∴2盖=1可乐
X=购买数量=初始瓶盖数=初始可乐数
于是X+X/2>=28
∴X>=28*2/3
∵X为整数
∴X=28*2/3向上取整,向上取整有更优化的办法,我没弄,直接+1了,+1会出现不剩瓶盖的前提下多买一瓶。
所以28 人要19瓶
50人要34瓶

回复 使用道具 举报
很好的逻辑题目。学习中。。。
回复 使用道具 举报
奋斗的蜗牛ksd 发表于 2014-12-23 22:22
错了吧,买3瓶  多 的是 一瓶可乐 和一个瓶盖
买九瓶 是9个瓶盖 和9瓶可乐,  9个瓶盖能换3个可乐。
我是 ...

请指导!谢谢!

1234.png (169.95 KB, 下载次数: 9)

1234.png

点评

不好意思,我认真看了你的思路,很明显是错误的。肯定不是每三瓶多一瓶,详细看我的解释吧。  发表于 2014-12-24 00:04
看我上面第二个答案的解释,和下面的代码分析,你的思路应该没问题的,我没认真看你的代码,不过第二种思路的答案是19和34是确定的  发表于 2014-12-24 00:00
回复 使用道具 举报
本帖最后由 奋斗的蜗牛ksd 于 2014-12-23 23:46 编辑
  1. <p> </p><p> </p><p>package entrenceTest;
  2. /*
  3. * 一瓶可乐可以包含一个瓶盖
  4. */
  5. public class Coke {

  6.         CokeCap cap=new CokeCap();//1瓶可乐产生一个瓶盖               
  7. }
  8. package entrenceTest;

  9. import java.util.ArrayList;
  10. import java.util.List;

  11. public class CokeCap {

  12.         List<Integer> capTotal=new ArrayList<Integer>();

  13.         public boolean changeCap(){
  14.                 //每3瓶可乐可收集到3个瓶盖,可以换1瓶可乐,得到1个瓶盖
  15.                 if(capTotal.size()==3)
  16.                 {
  17.                         System.out.println("哦也,收集到3个瓶盖了,我拿3个瓶盖去换一瓶可乐!下个人不用买了,真高兴!");
  18.                         capTotal.clear();//3个瓶盖换了一瓶可乐后,3个瓶盖就没有了
  19.                         System.out.println("-----换来的可乐又得到了一个瓶盖,真棒!------");
  20.                         capTotal.add(1);//3个瓶盖换完后可以得到1个瓶盖                        
  21.                         return true;
  22.                 }
  23.                 return false;        
  24.         }
  25.         
  26.         public int receiveCap(){        
  27.                 capTotal.add(1);        
  28.                 return capTotal.size();//返回已有的瓶盖数量
  29.         }        
  30. }
  31. package entrenceTest;

  32. public class Person {

  33.         private int personNum;
  34.         Coke coke=new Coke();
  35.         
  36.         //设置需要可乐的人数
  37.         public void setNum(int personNum){
  38.                 this.personNum=personNum;
  39.                 System.out.println("人数="+personNum);
  40.         }
  41.         
  42.         //获取需要可乐的人数
  43.         public int getNum(){
  44.                 return personNum;
  45.         }
  46.         
  47.         /*
  48.          * 开始买可乐,
  49.          */
  50.         public void buyCoke(){

  51.                 int buyCokeNum=0;        //表示买可乐的数量
  52.                 int i=1;
  53.                 int changeNum=0;         //表示用瓶盖换到的可乐的数量
  54.                 for(i=1;i<=this.getNum();i++){
  55.                         buyCokeNum++;
  56.                         System.out.println("第"+i+"个人买了1瓶可乐,现共有"+(buyCokeNum+changeNum)+"瓶可乐");
  57.                         
  58.                         coke.cap.receiveCap();
  59.                         //如果兑换了一瓶可乐,则下个人不用买可乐了
  60.                         if(coke.cap.changeCap())
  61.                         {
  62.                                 i++;        //如果换了一次可乐,下一个人就不用买可乐了,跳过他
  63.                                 System.out.println("-----第"+i+"个人拿到换来的可乐,不用买了-----");
  64.                                 changeNum++;  
  65.                         }

  66.                 }
  67.                
  68.                 System.out.println("综上,需要买"+buyCokeNum+"瓶可乐,"+"需要换"+changeNum+"瓶可乐,剩"+coke.cap.capTotal.size()+"个瓶盖");
  69.                
  70.                
  71.         }
  72. }
  73. package entrenceTest;
  74. /*
  75. * 28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?假如是50人,又需要买多少瓶可乐?(需写 出分析思路)
  76. */
  77. public class MainClass {

  78.         public static void main(String[] args) {
  79.                 // TODO Auto-generated method stub
  80.                 Person p=new Person();
  81.                 p.setNum(50);//设置需要可乐的人数
  82. //                System.out.println(p.getNum());
  83.                 p.buyCoke();//调用buyCoke()方法,将得出需买几瓶可乐,需换几瓶可乐,还剩几个瓶盖的结果
  84.         }
  85. }</p>
复制代码

代码声明,由黑马前辈shuimu_88 所写,他支持的是19 和34的答案。非本人所写,我只是提出两种答案的分析和解释而已,汉字语言歧义性比较大,对题目的解读也不一样。所以答案不一样。

代码结果

输出结果为:
人数=50
第1个人买了1瓶可乐,现共有1瓶可乐
第2个人买了1瓶可乐,现共有2瓶可乐
第3个人买了1瓶可乐,现共有3瓶可乐
哦也,收集到3个瓶盖了,我拿3个瓶盖去换一瓶可乐!下个人不用买了,真高兴!
-----换来的可乐又得到了一个瓶盖,真棒!------
-----第4个人拿到换来的可乐,不用买了-----
第5个人买了1瓶可乐,现共有5瓶可乐
第6个人买了1瓶可乐,现共有6瓶可乐
哦也,收集到3个瓶盖了,我拿3个瓶盖去换一瓶可乐!下个人不用买了,真高兴!
-----换来的可乐又得到了一个瓶盖,真棒!------
-----第7个人拿到换来的可乐,不用买了-----
第8个人买了1瓶可乐,现共有8瓶可乐
第9个人买了1瓶可乐,现共有9瓶可乐
哦也,收集到3个瓶盖了,我拿3个瓶盖去换一瓶可乐!下个人不用买了,真高兴!
-----换来的可乐又得到了一个瓶盖,真棒!------
-----第10个人拿到换来的可乐,不用买了-----
第11个人买了1瓶可乐,现共有11瓶可乐
第12个人买了1瓶可乐,现共有12瓶可乐
哦也,收集到3个瓶盖了,我拿3个瓶盖去换一瓶可乐!下个人不用买了,真高兴!
-----换来的可乐又得到了一个瓶盖,真棒!------
-----第13个人拿到换来的可乐,不用买了-----
第14个人买了1瓶可乐,现共有14瓶可乐
第15个人买了1瓶可乐,现共有15瓶可乐
哦也,收集到3个瓶盖了,我拿3个瓶盖去换一瓶可乐!下个人不用买了,真高兴!
-----换来的可乐又得到了一个瓶盖,真棒!------
-----第16个人拿到换来的可乐,不用买了-----
第17个人买了1瓶可乐,现共有17瓶可乐
第18个人买了1瓶可乐,现共有18瓶可乐
哦也,收集到3个瓶盖了,我拿3个瓶盖去换一瓶可乐!下个人不用买了,真高兴!
-----换来的可乐又得到了一个瓶盖,真棒!------
-----第19个人拿到换来的可乐,不用买了-----
第20个人买了1瓶可乐,现共有20瓶可乐
第21个人买了1瓶可乐,现共有21瓶可乐
哦也,收集到3个瓶盖了,我拿3个瓶盖去换一瓶可乐!下个人不用买了,真高兴!
-----换来的可乐又得到了一个瓶盖,真棒!------
-----第22个人拿到换来的可乐,不用买了-----
第23个人买了1瓶可乐,现共有23瓶可乐
第24个人买了1瓶可乐,现共有24瓶可乐
哦也,收集到3个瓶盖了,我拿3个瓶盖去换一瓶可乐!下个人不用买了,真高兴!
-----换来的可乐又得到了一个瓶盖,真棒!------
-----第25个人拿到换来的可乐,不用买了-----
第26个人买了1瓶可乐,现共有26瓶可乐
第27个人买了1瓶可乐,现共有27瓶可乐
哦也,收集到3个瓶盖了,我拿3个瓶盖去换一瓶可乐!下个人不用买了,真高兴!
-----换来的可乐又得到了一个瓶盖,真棒!------
-----第28个人拿到换来的可乐,不用买了-----
第29个人买了1瓶可乐,现共有29瓶可乐
第30个人买了1瓶可乐,现共有30瓶可乐
哦也,收集到3个瓶盖了,我拿3个瓶盖去换一瓶可乐!下个人不用买了,真高兴!
-----换来的可乐又得到了一个瓶盖,真棒!------
-----第31个人拿到换来的可乐,不用买了-----
第32个人买了1瓶可乐,现共有32瓶可乐
第33个人买了1瓶可乐,现共有33瓶可乐
哦也,收集到3个瓶盖了,我拿3个瓶盖去换一瓶可乐!下个人不用买了,真高兴!
-----换来的可乐又得到了一个瓶盖,真棒!------
-----第34个人拿到换来的可乐,不用买了-----
第35个人买了1瓶可乐,现共有35瓶可乐
第36个人买了1瓶可乐,现共有36瓶可乐
哦也,收集到3个瓶盖了,我拿3个瓶盖去换一瓶可乐!下个人不用买了,真高兴!
-----换来的可乐又得到了一个瓶盖,真棒!------
-----第37个人拿到换来的可乐,不用买了-----
第38个人买了1瓶可乐,现共有38瓶可乐
第39个人买了1瓶可乐,现共有39瓶可乐
哦也,收集到3个瓶盖了,我拿3个瓶盖去换一瓶可乐!下个人不用买了,真高兴!
-----换来的可乐又得到了一个瓶盖,真棒!------
-----第40个人拿到换来的可乐,不用买了-----
第41个人买了1瓶可乐,现共有41瓶可乐
第42个人买了1瓶可乐,现共有42瓶可乐
哦也,收集到3个瓶盖了,我拿3个瓶盖去换一瓶可乐!下个人不用买了,真高兴!
-----换来的可乐又得到了一个瓶盖,真棒!------
-----第43个人拿到换来的可乐,不用买了-----
第44个人买了1瓶可乐,现共有44瓶可乐
第45个人买了1瓶可乐,现共有45瓶可乐
哦也,收集到3个瓶盖了,我拿3个瓶盖去换一瓶可乐!下个人不用买了,真高兴!
-----换来的可乐又得到了一个瓶盖,真棒!------
-----第46个人拿到换来的可乐,不用买了-----
第47个人买了1瓶可乐,现共有47瓶可乐
第48个人买了1瓶可乐,现共有48瓶可乐
哦也,收集到3个瓶盖了,我拿3个瓶盖去换一瓶可乐!下个人不用买了,真高兴!
-----换来的可乐又得到了一个瓶盖,真棒!------
-----第49个人拿到换来的可乐,不用买了-----
第50个人买了1瓶可乐,现共有50瓶可乐
综上,需要买34瓶可乐,需要换16瓶可乐,剩2个瓶盖

还是认真看我对两种答案的解释吧,我说的很清楚了。
回复 使用道具 举报
奋斗的蜗牛ksd 发表于 2014-12-23 23:41
代码声明,由黑马前辈shuimu_88 所写,他支持的是19 和34的答案。非本人所写,我只是提出两种答案的分析和 ...

嗯!!很明白了~~~感谢啊!!
回复 使用道具 举报
互相帮助提高啊,共同进步,加油!
回复 使用道具 举报
/*
我的思路如下:


1.一次买1瓶                买的数量+1,已喝人数+1,剩余瓶盖+1

2.判断剩余瓶盖数:
        为0            刚开始
        为1或2      不管
        为3            兑换           已喝人数+1,剩余瓶盖=1

3.回到1. 循环到喝的人数跟实际人数相等

以下为主要函数运行结果19瓶 34瓶

*/

class Demo
{
        public static void main(String[] args)
        {
                int num=28;                    //实际人数
                int r=0;                       //已喝人数或已喝人数+1
                int b=0;                       //买数量
                int s=0;                       //剩余瓶盖
                for(;num>r;)
                {
                        if(s==0)
                        {
                                b++;
                                r++;
                                s++;
                        }
                        else
                        {
                                b++;
                                r++;
                                s++;
                                if(s==3)
                                {
                                        r++;
                                        s=1;       
                                }
                        }       
                }
                System.out.println(b+"瓶");
        }
}
回复 使用道具 举报
奋斗的蜗牛ksd 发表于 2014-12-24 19:47
互相帮助提高啊,共同进步,加油!

嗯!!加油!
回复 使用道具 举报

你的思路简洁清晰哈~~~
回复 使用道具 举报
比较给力,有点复杂
回复 使用道具 举报
本帖最后由 as604049322 于 2014-12-25 19:14 编辑

我先写我的思路后,再看你们的代码
  1. /*
  2. 28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,
  3. 那么要买多少瓶可乐,够28人喝?假如是50人,
  4. 又需要买多少瓶可乐?(需写出分析思路)


  5. 思路分析:可以假设只需要买n瓶可乐即可,那么n瓶可乐还有n个瓶盖数
  6. 可以不断将瓶盖变成可乐,直到瓶盖数小于2。
  7. 当瓶盖数等于2时,我们可以向别人借一个瓶盖,换成一瓶可乐后喝完,换回去。
  8. */
  9. class  BuyCoke
  10. {
  11.     public static void main(String[] args)
  12.     {
  13.         System.out.println(buyCola(28,3));
  14.         System.out.println(buyCola(50,3));
  15.     }
  16.     /**
  17.     该函数用于处理m人买可乐喝,n个可乐瓶盖可以换一瓶可乐,</br>
  18. 需要买多少瓶可乐够m人喝的问题。该函数考虑了,当瓶盖数等于n-1时,
  19. 可以借一个瓶盖喝完再换回去的情况,也就是说只剩下n-1个瓶盖时也依然可以喝一瓶可乐。
  20.     @param total 代表买可乐的人数
  21.     @param num 代表n个可乐瓶盖可以换一瓶可乐
  22.     @return 返回实际需要购买的可乐数
  23.     */
  24.     public static int buyCola(int total,int num){
  25.         int cola;
  26.         int cap;
  27.         int sum;
  28.         for(int i=total/2;i<=total;i++){//结果肯定大于总人数的一半
  29.             sum=i;
  30.             cap=i;
  31.             while(cap>=num){
  32.                cola=cap/num;
  33.                cap%=num;
  34.                cap+=cola;
  35.                sum+=cola;
  36.             }
  37.             if(cap==num-1)
  38.                 sum++;
  39.             if(sum>=total)
  40.                 return i;
  41.         }
  42.         return 0;
  43.     }
  44. }
复制代码


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