黑马程序员技术交流社区
标题:
编程解决李白提壶买酒的问题?
[打印本页]
作者:
prospect
时间:
2012-7-22 12:41
标题:
编程解决李白提壶买酒的问题?
最近发现一个很有趣的问题,就是编程解决李白提壶买酒的问题。
李白街上走,提壶去买酒,遇店加一倍,见花喝一斗,五遇店和花,喝光壶中酒。壶中原有多少酒?
作者:
梁志仲
时间:
2012-7-22 15:49
//如果是店和花交替出现,则如下:
public class Demo
{
public static void main( String[] args)
{
float wine = 0.5f; //第5次遇花时喝了1斗,喝光了,即第5次遇店后有酒1斗,遇店前有酒0.5斗
for (int i=4; i>0; i--)
{
wine = (wine+1)/2; //从第5次遇店前开始往上倒推,上一次遇店加酒后有酒应为上次见花时喝了的1斗和喝了后剩的酒之和
System.out.println(wine); //则加酒前为加酒后的一半。这里计算的正是加酒前的量。
//当i=1,即为计算第一次遇店前,壶里酒的量
}
System.out.println("壶中原有酒:"+wine+"斗");
}
}
//如果是先遇5次店再遇5次花,则如下:
/*
public class Demo
{
public static void main( String[] args)
{
float wine = 5f; //第5次遇店后有酒5斗
for (int i=5; i>0; i--)
{
wine = wine/2; // 每次遇店加一倍,则上一次遇店前,壶里酒的量是遇店后的一半,这里计算加酒前的量
System.out.println(wine);
}
System.out.println("壶中原有酒:"+wine+"斗");
}
}
*/
作者:
张凯
时间:
2012-7-22 17:26
下面是遇一次店再遇一次花,用逆推法:
假设最后一次遇花喝一斗为1。
店 花 店 花 店 花 店 花
0.96875 1.9375 0.9375 1.875 0.875 1.75 0.75 1.5
店 花
0.5 1
public class Demo{
public static void main(String[] args){
double h=0; // h表示最后喝完的酒的斗数
double y; // y表示酒壶中原有的酒的斗数
for(int i=1;i<=5;i++){
h=h+1; //最后一次遇花时应有酒1斗
y=h/2.0; //遇店加一倍,逆向就乘以1/2
}
System.out.println("李白壶中原有 "+y+" 斗酒");
}
}
复制代码
作者:
程潇
时间:
2012-7-22 18:59
题目:李白街上走,提壶去买酒,遇店加一倍,见花喝一斗,五遇店和花,喝光壶中酒。壶中原有多少酒?
思路:
通过题目可以确定的是,第5次遇见花时,壶中有酒1斗。
由于店和花遇见的顺序和次数不一样的话,变数较多,情况差别很大。为了简化问题,我们只考虑五次交替遇见店和花。
那么,按照第5次遇见花的情况,进行逆推,思考过程如下:
1.第5次遇花时有酒1斗,那么第5次遇店时有酒1*1/2斗(1/2)
2.第4次遇花时有酒1+1/2斗(3/2),那么第4次遇店时有酒3/2*1/2斗(3/4)
3.第3次遇花时有酒1+3/4斗(7/4),那么第3次遇店时有酒7/4*1/2斗(7/8)
4.第2次遇花时有酒1+7/8斗(15/8),那么第2次遇店时有酒15/8*1/2斗(15/16)
5.第1次遇花时有酒1+15/16斗(31/16),那么第1次遇店时有酒31/16*1/2斗(31/32)
用逆推法,反向思考的话,就是开始没有酒,遇见花加1,遇见店减半1/2,求第5次遇见店时有多少酒,即为题目中壶中原有的酒
class Test {
public static void main( String[] args){
float x= 0; //开始没有酒,x=0
for(int i=0; i<5; i++){
x=x+1; //见花加1
x=x*1/2; //遇店减半 x=x*1/2
}
System.out.println("壶中原有酒:"+x+"斗");
}
}
结果如下:
jiu.png
(2.32 KB, 下载次数: 93)
下载附件
2012-7-22 18:59 上传
作者:
郑小杰
时间:
2012-7-22 22:35
/*
需求;李白街上走,提壶去买酒,遇店加一倍,见花喝一斗,五遇店和花,喝光壶中酒。壶中原有多少酒?
分析:五遇店和花,据我的理解,应该说的是店和花交替出现的,而且最后一定遇到花,这样倒着思考就很
容易了
*/
class Demo
{
public static void main( String[] args)
{
float x= 0; //最后一次遇到花,酒是0
for(int i=0; i<5; i++)
{
x=x+1; //见花喝一斗,反向就是加1
x=x*1/2; //遇店加一倍,反向就是乘以1/2
}
System.out.println("壶中原有"+x+"斗酒");
}
}
作者:
李菁
时间:
2012-7-23 10:19
public class Drink{
public static void main(String[] args){
double x = 0; //存储当前的酒量
for(int i = 0; i < 5; i++){
x = (x + 1) / 2; //遇店加一倍,逆向思维,所以就除以2
}
System.out.println("李白共买酒为: " + x);
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2