黑马程序员技术交流社区
标题:
买可乐例子两种方式。
[打印本页]
作者:
fanshuai
时间:
2015-3-5 23:35
标题:
买可乐例子两种方式。
/*
* 28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,
* 够28人喝?假如是50人,又需要买多少瓶可乐?
* 思路:
* 1.这个问题有两种思考方式,看碰到什么老板
* 2.碰到好老板:买2瓶给你3瓶,不过喝完要把盖子还给老板用简单的% /实现
* 3. 碰到不讲理的老板:必须凑够3个盖子才给你1瓶,2个盖子不能换如果最后累计到了3个瓶盖,
* 还可以换1瓶多余的,没办法,老板不讲理
*4.28和50算出来是一样的,多试几个数就知道两种算出来的不一样,比如6个人,就不一样,碰见不讲理的
*老板的最后会剩下3个盖子,也就是多了1瓶(老板不管你这个,你多买1瓶他就多赚点钱)
*步骤:
*不写了,很简单,代码上有注释。
*/
package cn.heima.test1;
public class BuyCola {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(badBoss(6));
System.out.println(goodBoss(6));
}
//碰见好老板,2瓶2瓶买
public static int goodBoss(int person){
//按3人分组,看余多少人
int per=person%3;
//分为num组买,3人一组,一次买2瓶
int num=person/3;
//2瓶*Num+多余的人数就是要买的可乐数
return 2*num+per;
}
//碰见不讲理的老板,只能3个盖子换1瓶
public static int badBoss(int person){
//n为瓶盖
//cola可以喝的可乐数,包含买的和换的
int buyNum=0;//buyNum买的可乐数
for(int cola=0,n=0;cola<person;cola++){
if(n==3){
//够了三个瓶盖,瓶盖累计改为1
n=1;
}
else{
//不够三个瓶盖,可乐数加1(买的),瓶盖加1
buyNum++;
n++;
}
//如果最后累计到了3个瓶盖,还可以换1瓶多余的,没办法,老板不讲理
}
return buyNum;
}
}
作者:
wdhm5423
时间:
2015-3-8 19:24
这跟老板没关系吧??规则就是3个可乐瓶盖可以换一瓶可乐。
/*
28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐,够28人喝?假如是50人,又需要买多少瓶可乐?
思路:
1,买n瓶,那么有n人喝,还有n个盖子
2,n个盖子可以换n/3瓶喝,还会有n/3+n%3个盖子 。已经可以n+n/3人喝
3,剩下的盖子再递归,结束条件是你剩下的盖子不到3个,换不了了就结束。
*/
public class Test {
public static void main(String[] args) {
int n = 7;//几人喝
mai(n);
}
private static void mai(int n) {
for(int m=0;;m++){//m代表买几瓶
int num=gai(m,m);//调用函数,买了m瓶,所以有m瓶盖,已经够m人喝,递归之后可以算出m瓶够几个人喝
if(num>=n){//只要人数大于等于设定的多少人喝即可
System.out.println(m);
break;
}
}
}
public static int gai(int a,int b){//a表示瓶盖,b表示已经够多少人喝
if(a<3)
return b;//盖子少于3个,可以返回几个人喝
b=a/3+b;//把盖子拿去换,又有a/3人可以喝,加上之前b人,现在是b+a/3人可以喝
a=a/3+a%3;//盖子还来的瓶子,a/3瓶还有a/3盖子,再加上上面没除尽剩下的盖子,就是现在的盖子数
return gai(a,b);//递归,传入盖子和已经够喝的人数
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2