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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

思路分析:
一、每次购买一瓶,达到可以兑换瓶盖的数量(即数量大于3)时;
二、进行一次循环兑换(在一个while(count>3));
三、兑换后可乐总数量与喝可乐人数是否相等,如果相等表示够喝了。

相信写到这里大家都会写这段代码了。
这是一道不算太难的算法题,但是需要一个小分析,
需要一点时间画一个图,这样开发起来就不会感觉难的了。

53 个回复

倒序浏览
本帖最后由 sq_jun 于 2015-1-28 00:03 编辑
  1. public static void main(String [] args)
  2. {
  3.          int count =0,n=0;//count为买的可乐瓶数,n为买的和换的总瓶数
  4.                while (true) {   
  5.                    if(n%3==0)//每买3瓶可乐可以兑换1瓶,可乐总数+1
  6.                        n++;
  7.                        n++;   //每次循环总数加1
  8.                    count++;   //每次循环买的瓶数加1
  9.                   
  10.                    if(n>=28)//当达到28瓶就跳出
  11.                        break;
  12.         
  13.     }
  14.                System.out.println(count);//打印买的可乐瓶数

  15. }
复制代码
回复 使用道具 举报 1 1
思路:  我觉的还是这样好理解一点
* 方法一: 3个瓶盖可以换一瓶,那么相当于3人只需要两瓶就够了。
* 但要考虑不能先喝可乐在换瓶盖的情况,这样就可以先假设每个人一瓶,
* 再减去每3个人多买的一瓶,但这样总人数要减去一个。
* <p/>
* 方法二: 除去第一个人,后边的人每3人为一组,不够3人为最后一组,
* 如果最后一组为三人,就相当于,每组只需买两瓶就够,连个瓶盖加上
* 上一人留下的瓶盖就可以换得一瓶,并 把瓶盖留给下一组使用。如果
* 最后一组少于3人,则每人需买一瓶。
*
*/
public class Test10 {

    public static void main(String[] args) {

        method_1(28);
        method_1(50);
        method_2(28);
        method_2(50);
    }

    public static void method_1(int peopleNumbers) {
        /**
         * “(peopleNumbers-1)/3”:除去第一个人后,没够3人就减去
         */
        int colaNumbers = peopleNumbers - (peopleNumbers - 1) / 3;
        System.out.println("方法一:" + peopleNumbers + "人需要买" + colaNumbers + "瓶可乐。");
    }

    public static void method_2(int peopleNumbers) {
        /**
         * “1”:为第一个人买的数量。
         * “((peopleNumbers-1)/3)*2”:为除去第一个人,人数够3人小组需买的数量。
         * “(peopleNumbers-1)%3”:为除去第一个人,人数不够3人的小组需买的数量。
         */
        int colaNumbers = 1 + ((peopleNumbers - 1) / 3) * 2 + (peopleNumbers - 1) % 3;
        System.out.println("方法二:" + peopleNumbers + "人需要买" + colaNumbers + "瓶可乐。");
    }
}

回复 使用道具 举报 2 0

这个题做得不错,但是还有一个小问题,兑换后的那瓶汽水是不是也有一个瓶盖,是不是得加上去呢?
回复 使用道具 举报
lpf870826 发表于 2015-1-28 10:26
思路:  我觉的还是这样好理解一点
* 方法一: 3个瓶盖可以换一瓶,那么相当于3人只需要两瓶就够了。
*  ...

这两个算法就牛B了感觉数学成份多一点,哥们你不会是搞大数据的吧!
回复 使用道具 举报
bowen-xiao 发表于 2015-1-28 16:04
这个题做得不错,但是还有一个小问题,兑换后的那瓶汽水是不是也有一个瓶盖,是不是得加上去呢? ...

可以和老板商量,等喝完了再把盖给他。;P
回复 使用道具 举报
心算后感觉要买19瓶不知道是不是
回复 使用道具 举报
bowen-xiao 发表于 2015-1-28 16:14
这两个算法就牛B了感觉数学成份多一点,哥们你不会是搞大数据的吧!

我其实是觉的这个简单,好记,呵呵,其实也是看别人的
回复 使用道具 举报
呵呵路过来看看,蛮好玩的
回复 使用道具 举报
恩是蛮好玩的
回复 使用道具 举报
本帖最后由 礼礼小跑 于 2015-1-28 22:52 编辑

这种算法题不错!
回复 使用道具 举报
gzy 来自手机 中级黑马 2015-1-28 22:54:37
12#
路过来学习学习               
回复 使用道具 举报
bowen-xiao 发表于 2015-1-28 16:04
这个题做得不错,但是还有一个小问题,兑换后的那瓶汽水是不是也有一个瓶盖,是不是得加上去呢? ...

加到总数里面了啊
回复 使用道具 举报
飘过,顶一下
回复 使用道具 举报
二楼正解~~

点评

二楼有问题,当50人的时候算出买33瓶,实际要34瓶  发表于 2015-3-15 22:22
回复 使用道具 举报
赞!!!!
回复 使用道具 举报
总结的公式    return (n%3==0)?(n-n/3+1) : (n-n/3)
回复 使用道具 举报 2 0
  1. public static void main(String[] args)
  2.         {       
  3.                 //声明接收设备,接受数据
  4.                 System.out.println("请输入人数:");
  5.                 Scanner scanner = new Scanner(System.in);
  6.                 int i = scanner.nextInt();
  7.                 //调用计算方法
  8.                 int num = methord(i);
  9.                 System.out.println(i+"个人最少需要买"+num+"瓶饮料");
  10.         }
  11.         public static int methord(int i)
  12.         {
  13.                 int a = 1;//用来循环/3,%3,的过程
  14.                 int b = 0;//用来记录共喝了多少瓶
  15.                 int c = 0;//用来记录a的原始值
  16.                 while(true)//a从1开始不断自增,当满足人数时,返回该值
  17.                 {
  18.                         c = a;
  19.                         b = 0;//每次循环对b值进行还原。
  20.                         b += a;
  21.                         while(a/3>0)
  22.                         {
  23.                                 b +=a /3;//瓶盖换的汽水数
  24.                                 a = a/3+a%3;//换完后剩余的瓶盖数
  25.                         }
  26.                         //if(a%3==2)当可以先喝汽水再用三个瓶盖换时,加入这两步
  27.                                 //b++;
  28.                         if(b>=i)
  29.                                 return c;
  30.                         else
  31.                                 a = c+1;
  32.                 }
  33.         }
复制代码

我的方法。。。。。。。
回复 使用道具 举报
lpf870826 发表于 2015-1-28 10:26
思路:  我觉的还是这样好理解一点
* 方法一: 3个瓶盖可以换一瓶,那么相当于3人只需要两瓶就够了。
*  ...

这个思路好~
回复 使用道具 举报
其实很简单,不用想那么复杂
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马