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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

       在qq审核群里,有哥们提了一问题:30个小运动员在参加完比赛后,口渴难耐,去小店买饮料,饮料店搞促销,凭三个空瓶可以再换一瓶,他们最少买多少瓶饮料才能保证一人一瓶?
      其实用逻辑判断很简单,三个空瓶换一瓶饮料加一个空瓶,意思是3空瓶=1饮料+1空瓶,也就是1空瓶=0.5饮料。所以30/1.5=20,很容易可以获得答案,但是在计算机上怎么实现呢?我绞尽乳汁的想啊想,编了代码如下:
  1. /*
  2. 需求:
  3. 30个小运动员在参加完比赛后,口渴难耐,去小店买饮料,饮料店搞促销,凭
  4. 三个空瓶可以再换一瓶,他们最少买多少瓶饮料才能保证一人一瓶?

  5. 分析:因为是求最小值,所以可以搞一个实际购买的瓶数num从1开始的for循环,
  6.      直到满足了总共换取30瓶饮料,退出循环,打印实际购买瓶数即可。
  7. */

  8. class Test
  9. {
  10.         public static int getNum(int personNum)
  11.         {
  12.                 //emptyNum用于记录空瓶数,hasNum是实际喝到的瓶数,temp是临时变量。
  13.                 int emptyNum,hasNum,temp;
  14.                 //num是实际购买的瓶数,从1开始网上循环,直至满足得到30瓶饮料的要求。
  15.                 for(int num=1;true;num++)
  16.                 {
  17.                         emptyNum=num;
  18.                         hasNum=num;
  19.                         //用while循环来模拟3个空瓶换1瓶饮料,当小于2时退出循环
  20.                         while(emptyNum>=2)
  21.                         {
  22.                                 //当空瓶数等于2的时候还可以换一瓶饮料,hasNum加1退出循环
  23.                                 if (emptyNum==2)
  24.                                 {
  25.                                         hasNum+=1;
  26.                                         emptyNum=0;
  27.                                         break;
  28.                                 }
  29.                                 //下面几行代码是当emptyNum大于3时,来获得hasNum和emptyNum
  30.                                 temp=emptyNum;
  31.                                 temp=temp / 3;
  32.                                 hasNum+=temp;
  33.                                 emptyNum=(emptyNum%3)+temp;
  34.                         }
  35.                         //当得到的瓶数等于人数的时候,满足条件,返回购买的瓶数

  36.                         if (hasNum>=personNum)
  37.                                 return num;
  38.                 }
  39.         }
  40.         public static void main(String[] args)
  41.         {
  42.                 System.out.print(getNum(30));
  43.         }
  44. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

3 个回复

倒序浏览
这个问题很有意思,我也自己试一试
回复 使用道具 举报
本帖最后由 new999 于 2014-9-21 09:41 编辑
  1. package com.itheima.test;

  2. public class EmptyBottles{
  3.         public static void main(String[] args){
  4.                 int pNum=28;
  5.                 System.out.println("买来"+getBottles(pNum)+"瓶饮料,够"+pNum+"人喝");
  6.         }

  7.         private static int getBottles(int pNum) {
  8.                 //empty用于记录空瓶数,sum是实际喝到的瓶数,bottles2是换来的可乐。
  9.                 int sum, empty,bottles2;
  10.                 for (int i = pNum>>>1; i <=pNum; i++) {
  11.                         sum = i;//初始瓶数i,喝掉i瓶,
  12.                         empty = i;//产生i瓶空瓶
  13.                         while ((bottles2=empty/3)!=0) {//空瓶换饮料
  14.                                 sum += bottles2;//喝掉换来的饮料,
  15.                                 empty = bottles2 + empty%3;//产生的空瓶再加上上次剩下的空瓶
  16.                         }
  17.                         if(empty==2){//向老板赊来1瓶,最后用3个空瓶偿还
  18.                                 sum++;
  19.                         }
  20.                         //System.out.println("买来"+i+"瓶饮料,够"+sum+"人喝,最后剩下个"+empty+"空瓶");
  21.                         if(sum>=pNum){
  22.                                 return i;
  23.                         }
  24.                 }
  25.                 return pNum;
  26.         }
  27. }
复制代码
回复 使用道具 举报
//当空瓶数等于2的时候还可以换一瓶饮料,hasNum加1退出循环

不是3个空瓶才能换一瓶饮料吗,怎么说空瓶数等于2就可以换一瓶饮料了呢?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马