黑马程序员技术交流社区
标题:
代码分享:3个空瓶换1瓶饮料,30个人要买几瓶够一人一瓶?
[打印本页]
作者:
黑马-许鹏
时间:
2013-5-17 00:57
标题:
代码分享:3个空瓶换1瓶饮料,30个人要买几瓶够一人一瓶?
在qq审核群里,有哥们提了一问题:30个小运动员在参加完比赛后,口渴难耐,去小店买饮料,饮料店搞促销,凭三个空瓶可以再换一瓶,他们最少买多少瓶饮料才能保证一人一瓶?
其实用逻辑判断很简单,三个空瓶换一瓶饮料加一个空瓶,意思是3空瓶=1饮料+1空瓶,也就是1空瓶=0.5饮料。所以30/1.5=20,很容易可以获得答案,但是在计算机上怎么实现呢?我绞尽乳汁的想啊想,编了代码如下:
/*
需求:
30个小运动员在参加完比赛后,口渴难耐,去小店买饮料,饮料店搞促销,凭
三个空瓶可以再换一瓶,他们最少买多少瓶饮料才能保证一人一瓶?
分析:因为是求最小值,所以可以搞一个实际购买的瓶数num从1开始的for循环,
直到满足了总共换取30瓶饮料,退出循环,打印实际购买瓶数即可。
*/
class Test
{
public static int getNum(int personNum)
{
//emptyNum用于记录空瓶数,hasNum是实际喝到的瓶数,temp是临时变量。
int emptyNum,hasNum,temp;
//num是实际购买的瓶数,从1开始网上循环,直至满足得到30瓶饮料的要求。
for(int num=1;true;num++)
{
emptyNum=num;
hasNum=num;
//用while循环来模拟3个空瓶换1瓶饮料,当小于2时退出循环
while(emptyNum>=2)
{
//当空瓶数等于2的时候还可以换一瓶饮料,hasNum加1退出循环
if (emptyNum==2)
{
hasNum+=1;
emptyNum=0;
break;
}
//下面几行代码是当emptyNum大于3时,来获得hasNum和emptyNum
temp=emptyNum;
temp=temp / 3;
hasNum+=temp;
emptyNum=(emptyNum%3)+temp;
}
//当得到的瓶数等于人数的时候,满足条件,返回购买的瓶数
if (hasNum>=personNum)
return num;
}
}
public static void main(String[] args)
{
System.out.print(getNum(30));
}
}
复制代码
作者:
java.exe
时间:
2013-5-17 01:02
这个问题很有意思,我也自己试一试
作者:
new999
时间:
2014-9-20 23:36
本帖最后由 new999 于 2014-9-21 09:41 编辑
package com.itheima.test;
public class EmptyBottles{
public static void main(String[] args){
int pNum=28;
System.out.println("买来"+getBottles(pNum)+"瓶饮料,够"+pNum+"人喝");
}
private static int getBottles(int pNum) {
//empty用于记录空瓶数,sum是实际喝到的瓶数,bottles2是换来的可乐。
int sum, empty,bottles2;
for (int i = pNum>>>1; i <=pNum; i++) {
sum = i;//初始瓶数i,喝掉i瓶,
empty = i;//产生i瓶空瓶
while ((bottles2=empty/3)!=0) {//空瓶换饮料
sum += bottles2;//喝掉换来的饮料,
empty = bottles2 + empty%3;//产生的空瓶再加上上次剩下的空瓶
}
if(empty==2){//向老板赊来1瓶,最后用3个空瓶偿还
sum++;
}
//System.out.println("买来"+i+"瓶饮料,够"+sum+"人喝,最后剩下个"+empty+"空瓶");
if(sum>=pNum){
return i;
}
}
return pNum;
}
}
复制代码
作者:
hellotaomi
时间:
2015-5-15 11:11
//当空瓶数等于2的时候还可以换一瓶饮料,hasNum加1退出循环
不是3个空瓶才能换一瓶饮料吗,怎么说空瓶数等于2就可以换一瓶饮料了呢?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2