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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

  5. public class Test {

  6.         public static void main(String[] args) {
  7.                 int pNum = 4;
  8.                 System.out.println(getNum(pNum));
  9.         }
  10.        
  11.         /*思路:买3送1,那么每增加4个人实际上只增加了3瓶可乐*/
  12.         public static int getNum(int pNum) {
  13.                
  14.                 /*
  15.                  x=购买数量中不被3整出的部分,也就是无法参加满三赠一的部分人,
  16.                  值可能是0(被4整除,那么瓶数也一定是3的整数倍),1,2,3;
  17.                  不管是几,这一部分人的可乐都属于实际购买可乐数量的一部分,所以最后公式中要加上.
  18.                 */
  19.                 int x = pNum % 4;  
  20.                
  21.                
  22.                 /*
  23.                  y=要送的瓶数;3个人送1瓶就是4瓶,每4个人中有一个人是送的,所以用人数/4
  24.                 */
  25.                 int y = pNum / 4;
  26.                
  27.                 /*
  28.                  因为y是送的瓶数,那么每送一瓶其实就是买了3瓶,
  29.                  所以用3*y是实际买的3的整数倍瓶数(不包含送的),再加上x,就等于实际购买数量.
  30.                 */
  31.                 return (3 * y + x);
  32.         }
  33. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

21 个回复

倒序浏览
我贴一下代码,共同交流下,不知对否
  1. class Test
  2. {
  3.         public static void main(String [] args)
  4.         {
  5.                 int count=getCount(28);
  6.                 System.out.println("28人买"+count+"瓶可乐");
  7.         }
  8.         public static int getCount(int PerSonNum)
  9.         {
  10.                 //定义num,记录总盖数,因为瓶数和盖数对应
  11.                 int num=0;
  12.                 //定义count,记录“购买”的数量
  13.                 int count=0;
  14.                 while(num<10)
  15.                 {
  16.                         count++;
  17.                         num++;
  18.                         if(num%3==0)//如果瓶盖够三个,就让瓶盖加1,对应的瓶数也增加,但此瓶不是购买的
  19.                         {
  20.                                 num++;
  21.                         }
  22.                 }
  23.                 return count;
  24.         }
  25. }
复制代码



回复 使用道具 举报 0 1
论坛有位猛哥发答案了!思路清晰,代码简洁!用穷举推!
回复 使用道具 举报
你这代码,有点问题啊,28人时,结果是21瓶,不对吧,逻辑有点问题,我再看看,看看别人的吧
  1. /**
  2. * 题目10:
  3. *28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?
  4. *假如是50人,又需要买多少瓶可乐?(需写出分析思路)
  5. *@author
  6. *
  7. *思路:
  8.         1:定义一个int型变量代表瓶盖数,当瓶盖数没有到3时,就继续购买可乐,同时平盖数加1;
  9.         2:当瓶盖数达到3,就把瓶盖数置为1,这次就不用购买可乐;
  10.         3:循环28次,便可使28人都能喝到可乐
  11. */
  12. public class Test10 {
  13.         /**
  14.          * @param args
  15.          */
  16.         public static void main(String[] args) {
  17.                 // TODO Auto-generated method stub
  18.                 System.out.println("28人喝可乐需要买"+buyCokes(28)+"瓶");
  19.                 System.out.println("50人喝可乐需要买"+buyCokes(50)+"瓶");
  20.         }
  21.         private static int buyCokes(int num) {
  22.                 // TODO Auto-generated method stub
  23.                 int bottle_cap = 0;//初始的瓶盖数为0;
  24.                 int sum = 0;//要购买可乐的瓶数
  25.                 for(int i=0;i<num;i++){//循环判断,直到28人都有可乐
  26.                         if(bottle_cap !=3){//当瓶盖不满3个时,
  27.                                 sum++;//就购买一瓶饮料,
  28.                                 bottle_cap++;//同时把瓶盖数加1;
  29.                         }
  30.                         else{
  31.                                 bottle_cap = 1;//当瓶盖数满3时,就把瓶盖数重置为1;
  32.                         }
  33.                 }
  34.                 return sum;//返回要购买的可乐数
  35.         }
  36. }
复制代码
回复 使用道具 举报
肖建伟 发表于 2014-10-27 19:27
论坛有位猛哥发答案了!思路清晰,代码简洁!用穷举推!

还没学到穷举...
回复 使用道具 举报
坚持525 发表于 2014-10-27 19:53
你这代码,有点问题啊,28人时,结果是21瓶,不对吧,逻辑有点问题,我再看看,看看别人的吧
...

买21瓶送7瓶不是嘛....{:3_54:}
回复 使用道具 举报
noiary 高级黑马 2014-10-28 08:54:59
7#
坚持525 发表于 2014-10-27 19:53
你这代码,有点问题啊,28人时,结果是21瓶,不对吧,逻辑有点问题,我再看看,看看别人的吧
...

噢..我明白了,送的瓶数没有加进去....
回复 使用道具 举报
noiary 发表于 2014-10-28 08:49
买21瓶送7瓶不是嘛....

那还剩7个盖子呢
回复 使用道具 举报
  1. public static int getcount(int person) {
  2.                 int kele=0;//可乐总数
  3.                 int count=0;//购买次数
  4.                 while (kele<person)
  5.                 {
  6.                         kele++;
  7.                         count++;//如果可乐小于人数,就买一次(可乐数+1,购买次数+1)
  8.                         if (kele%3==0)//如果可乐总数够3个就换一瓶(可乐数+1)
  9.                         {
  10.                                 kele++;
  11.                         }
  12.                 }
  13.                 System.out.println(count);//购买次数就是需要购买的可乐数
  14.         }
复制代码


回复 使用道具 举报
noiary 高级黑马 2014-10-28 10:34:52
10#

是的,这个被我忽略了- -.
回复 使用道具 举报
坚持525 发表于 2014-10-27 19:53
你这代码,有点问题啊,28人时,结果是21瓶,不对吧,逻辑有点问题,我再看看,看看别人的吧
...

else里面应该加上sum++和i++吧,三个瓶盖后,总数加一,还得少循环一次
回复 使用道具 举报
坚持525 发表于 2014-10-27 19:53
你这代码,有点问题啊,28人时,结果是21瓶,不对吧,逻辑有点问题,我再看看,看看别人的吧
...

else内应该加i++
回复 使用道具 举报

不用吧,上面有个for循环再遍历i啊,直到小余等于人数啊,
回复 使用道具 举报

不用吧,上面有个for循环再遍历i啊,直到小余等于人数啊,
回复 使用道具 举报

不用吧,上面有个for循环再遍历i啊,直到小余等于人数啊,
回复 使用道具 举报
本帖最后由 wzg1015 于 2014-10-29 05:47 编辑
  1. public class Demo4 {
  2.         public static void main(String[] args) {
  3.                 int n=28;//总数
  4.                 int i=n;//最大值
  5.                 while(true) {
  6.                         int count=i+demo1(i);
  7.                         if((n-count)>=0&&(n-count)<3){
  8.                                 break;
  9.                         }
  10.                         i--;//
  11.                 }
  12.                 System.out.println(i+"+赠送"+demo1(i)+"+"+(n-i-demo1(i))+"="+n);
  13.                 System.out.println("购买数:"+i+"+"+(n-i-demo1(i)));//前面数都有赠送,后面0-2瓶是无赠送的
  14.                 System.err.println("实际赠送数:"+demo1(n-<span style="line-height: 30.7999992370605px;">demo1(i)</span><span style="line-height: 2.2em;">));</span>
复制代码
回复 使用道具 举报
我写的答案就是21瓶是对的,难道现实中都能借饮料吗?除非老板是个好人,但是好人太少,坏人太多
回复 使用道具 举报
noiary 高级黑马 2014-10-30 23:07:35
18#
axing110 发表于 2014-10-29 07:38
我写的答案就是21瓶是对的,难道现实中都能借饮料吗?除非老板是个好人,但是好人太少,坏人太多 ...

购买数量  赠送节点
1
2
3 1
4
5 1
6
7 1
8
9 1


除了第一屏,购买数量每增加到奇数就可以兑换一瓶可乐。
回复 使用道具 举报
我是来学习的!
回复 使用道具 举报
本帖最后由 麦兜表妹 于 2014-10-31 12:26 编辑
  1. public static void main(String[] args) {
  2.                 demo1(3,28);
  3.                 demo1(3,50);
  4.         }
  5.         
  6.         public static void demo1(int num,int people){
  7.                 /*
  8.                  思路:
  9.                  1、一瓶可乐,分开来看,包括一份可乐,还有有个盖子 即:1瓶可乐=1可乐+1盖子
  10.                           num个盖子换一瓶可乐,即:num盖子=1瓶可乐
  11.                           整理一下,可以得到:(num-1)盖子=1可乐,也就是1盖子=1/(num-1)可乐
  12.                           
  13.                  2、有28个人喝。
  14.                          设:需要购买x瓶可乐
  15.                                          x瓶可乐=28可乐
  16.                                  ==》x可乐+x盖子=28可乐
  17.                                  ==》n/(n-1)x可乐=28可乐
  18.                                  ==》x=28*((n-1)/n)
  19.                  3、得到的x不一定为整数,但,可乐的瓶数应为整数。
  20.                          所以,最终的结果应为大于x的最小整数
  21.                  * */
  22.                 int bottle;
  23.                 Double d=(people*(double)(num-1)/num);
  24.                 //思路中运算得到的公式。
  25.                 //强制转换成double,以便得到小数结果。
  26.                
  27.                 if(d.intValue()<d){//如果d小数部分不是0
  28.                         bottle=d.intValue()+1;//需要的瓶数+1
  29.                 }else{
  30.                         bottle=d.intValue();
  31.                 }
  32.                 System.out.println("购买"+bottle+"瓶可乐,可以供"+people+"人喝。");
  33.         }
复制代码
这个程序是假设如果手上有2个盖子,可以向老板借一个盖子,换一瓶可乐,喝完后再还给老板一个盖子。   

  1. System.out.println((double)bottle*num/(double)(num-1));//打印运算结果,方便测试时查看
  2.                 if(bottle*num/(double)(num-1)==people){
  3.                         bottle++;
  4.                 }
复制代码


如果在打印语句前,加上这个if循环,则为:老板是个抠门小气鬼,不借盖子的情况。这条语句,是之前得到的公式的反用。如果bottle*num/(double)(num-1)==people,说明需要向老板借一个盖子才能购买饮料。最后手中没有剩余的盖子。
主程序中加入demo1(3,51);进行测试。


没有加入if语句前:
  
加入if语句后



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