黑马程序员技术交流社区

标题: 一道编程题,求思路.... [打印本页]

作者: Imp_x    时间: 2014-8-21 22:03
标题: 一道编程题,求思路....
本帖最后由 Imp_x 于 2014-8-22 00:29 编辑

题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个     第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下     的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
看着有点晕= =不知道编程该如何表达,求高人指点

作者: 单线程xia    时间: 2014-8-21 22:16
倒着算,楼下补充
作者: Imp_x    时间: 2014-8-21 22:22
单线程xia 发表于 2014-8-21 22:16
倒着算,楼下补充

就是
第十天→第九天:(1+1)*2→4
第九天→第八天:(4+1)*2→5
.
.
.
这样倒着推么= =??代码如何表达啊....
作者: 笑脸迷人    时间: 2014-8-21 22:34
本帖最后由 笑脸迷人 于 2014-8-21 22:36 编辑

思路,其实就是一个求和
x(n):为第n天的桃子数,
x(n-1):第n-1天的桃子数
那么 就有2*(x(n-1)+1)=x(n)
  知道了x[1],求x[n]应该不难
  思路1:用for循环
  思路2:用递归~*/
public class MonkeyPeach {
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                System.out.println(sum(10,1));
                System.out.println(sum_1(10,1));
        }
        public static int sum(int days,int endNum)//days为天数,endNum为第days天早上的桃子数
        {
                for(int i=1;i<days;i++)//逆向求解
                {
                        endNum=(endNum+1)<<1;
                }
                return endNum;
        }
        public static int sum_1(int days,int endNum)//递归方法:
        {
                if(days<=1)//如果是第一天,那么就将第一天的桃子数返回就好了
                        return endNum;
                days--;//
                endNum=(endNum+1)<<1;
                return sum_1(days,endNum);//求解昨天的桃子数
        }
}




作者: 追求卓越    时间: 2014-8-21 23:02
class day3
{
        public static void main(String[] args)
        {
       
                int t =1;                         //定义一个变量t记录最后一天桃子是数量
                for (int i=2;i<=10 ;i++ )        //用for循环计算桃子是数量
                {
                        t=(1+t)*2;                   //用变量t记录每天桃子的数量
                System.out.println("第"+(11-i)+"天:"+t);//打印桃子每天的数量!
                }System.out.println("第一天猴子总共摘了"+t+"桃子");

        }
}

作者: 追求卓越    时间: 2014-8-21 23:22
笑脸迷人 发表于 2014-8-21 22:34
思路,其实就是一个求和
x(n):为第n天的桃子数,
x(n-1):第n-1天的桃子数

  递归方面我还没学到,不过验证了一下你的结果是对的,不过不如用简单的for循环来计算,不知道提问者能不能明白你的意思,所以我用for循环又写了一个。希望你的代码以后能简洁明了,杀鸡不用宰牛刀。希望你学业有成,不要放弃学习
作者: Imp_x    时间: 2014-8-22 00:26
笑脸迷人 发表于 2014-8-21 22:34
思路,其实就是一个求和
x(n):为第n天的桃子数,
x(n-1):第n-1天的桃子数

谢啦!很详细{:3_64:}
作者: Imp_x    时间: 2014-8-22 00:29
追求卓越 发表于 2014-8-21 23:02
class day3
{
        public static void main(String[] args)
  1. 简短明了!不过建议版主下次代码可以的话= =在代码那里输入
  2. 这样的话,代码中有哪里不懂的,可以直接说第几行哪一句不懂,方便查看跟解答~~
  3. 哈哈
复制代码

作者: 我行我SHOW‰    时间: 2014-8-22 00:44
笑脸迷人 发表于 2014-8-21 22:34
思路,其实就是一个求和
x(n):为第n天的桃子数,
x(n-1):第n-1天的桃子数

学习下大神的算法~~~
作者: 不再上网    时间: 2014-8-22 01:22
  1. public class Demo {

  2.         public static void main(String[] args) {
  3.                 // TODO Auto-generated method stub
  4.                 int count = 1;
  5.                 for (int i = 0; i < 9; i++) {
  6.                         count = (count+1)*2;
  7.                 }
  8.                 System.out.println("第一天猴子载的桃子是:"+count+"个");
  9.         }
  10. }
复制代码

作者: 追求卓越    时间: 2014-8-22 01:23
Imp_x 发表于 2014-8-22 00:29

呵呵嗯知道了,我也才学呢,
作者: Kikyou    时间: 2014-8-22 08:28
mark,学习学习
作者: 占星释    时间: 2014-8-22 13:12
public static void func(int i){return i>1?(func(i–1)+1)*2:1;}  用这个方法应该可以
作者: liusj    时间: 2014-8-22 14:33
class Fangfan                //通过函数解决
{
        public static void main(String[] args)
        {
             String a=method(10);
                 System.out.println(a);
        }
        public static String method(int day){
             String s="桃子总数是";
                  int  x=1;
                 for (int i=2;i<=day ; i++)
             {
                       
                          x=2*(x+1);       
              s=s+x+" ";         
             }
         return s;
        }
}
作者: happymouse    时间: 2014-8-22 18:35
不再上网 发表于 2014-8-22 01:22

正解,赞一个
作者: 怀念黑海岸    时间: 2014-8-22 21:26
        public int getAllPeach(int lastPeach,int day){// 使用for循环
                int peachTotal=1;
                for(int i=1;i<day;i++){
                        peachTotal=(peachTotal+1)*2;
                }
                return peachTotal;
        }
        public int getPeach(int lastPeach,int day){  //使用while循环
                int dayNow =1;
                int peachNow=1;
                while(dayNow<day){
                        peachNow =(peachNow+1)*2;
                        dayNow++;
                }
                return peachNow;
        }
        public int getPeachAll(int lastPeach,int day,int dayNow){//使用递归
                if(dayNow<=day){
                        System.out.println(dayNow+"天前,还有"+lastPeach+"个桃子");
                        dayNow++;
                        lastPeach =(lastPeach+1)*2;
                        getPeachAll(lastPeach,day,dayNow);
                }
                return lastPeach;
        }




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2