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

© prospect 初级黑马   /  2012-7-22 12:41  /  3105 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

最近发现一个很有趣的问题,就是编程解决李白提壶买酒的问题。
李白街上走,提壶去买酒,遇店加一倍,见花喝一斗,五遇店和花,喝光壶中酒。壶中原有多少酒?

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
//如果是店和花交替出现,则如下:
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+"斗");
        }
       
}
*/

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
下面是遇一次店再遇一次花,用逆推法:
     假设最后一次遇花喝一斗为1。
    店        花         店       花       店       花     店     花      
0.96875    1.9375     0.9375    1.875     0.875     1.75    0.75     1.5
     店     花
     0.5     1
  1. public class Demo{
  2.     public static void main(String[] args){
  3.         double h=0;                     // h表示最后喝完的酒的斗数
  4.         double y;                       // y表示酒壶中原有的酒的斗数
  5.         for(int i=1;i<=5;i++){           
  6.             h=h+1;                     //最后一次遇花时应有酒1斗
  7.             y=h/2.0;                   //遇店加一倍,逆向就乘以1/2
  8.         }
  9.         System.out.println("李白壶中原有 "+y+" 斗酒");
  10.     }
  11. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
/*
需求;李白街上走,提壶去买酒,遇店加一倍,见花喝一斗,五遇店和花,喝光壶中酒。壶中原有多少酒?
分析:五遇店和花,据我的理解,应该说的是店和花交替出现的,而且最后一定遇到花,这样倒着思考就很
           容易了
*/
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+"斗酒");
     }        
}        

回复 使用道具 举报
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);
     }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马