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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙百鑫   /  2013-6-15 16:11  /  14150 人查看  /  241 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

来看看  试一下
回复 使用道具 举报
Heart 中级黑马 2013-6-15 18:20:18
62#
Heart 发表于 2013-6-15 17:34
【运行结果】如下:

???
结果不对吗?怎么没技术分呢
回复 使用道具 举报
Heart 中级黑马 2013-6-15 18:21:23
63#
???
结果不对吗?怎么没技术分呢
回复 使用道具 举报
两位版主,不好意思,发现刚才我的那个计算结果是错的,思路没错,但结果错了,为了不误导大家 ,现将计算结果和代码重新修正如下,至于技术分都是其次的,因为我的早就25分了,主要是为了回顾一下

知识点
  1. /*
  2. 题目:猜一猜猴子摘了多少桃子呢?
  3. 猴子吃桃的问题:猴子第一天摘下来N个桃子,当天就吃了一半,但是还不过瘾,又多吃了一个,第二天早上又将
  4. 剩下的桃子吃了一半,又多吃了一个,以后每天早上都吃了前一天剩下的一半零一个,到第十天早上的时候就发现剩下
  5. 一个桃子了.求第一天一共摘下了多少桃子呢?

  6. 思路:1、此题是一个数学推理题,可以采用逆向思维进行推理,先定义一个方法用表达式表示出第九天的结果;
  7.           2、利用递归原理调用计算方法,这样即可得到计算结果。

  8. 步骤:1、定义一个类,把主函数和计算方法定义在这个类中即可。
  9.           2、定义计算方法及利用递归原理进行调用计算出结果。
  10.           3、定义主函数,调用方法即可得到计算结果。
  11. */
  12. class Demo
  13. {
  14.         public static void jiSuan(int i,int j)//定义计算方法
  15.         {
  16.                 int sum=j;
  17.                 System.out.println("第"+i+"天有"+sum+"个桃子");
  18.                 sum=(sum+1)*2;
  19.                 i--;
  20.                 if(i>0)
  21.                         jiSuan(i,sum);//递归调用
  22.         }       
  23.         public static void main(String[] args)
  24.         {
  25.                 jiSuan(10,1);//调用计算方法
  26.         }
  27. }
复制代码
计算结果如下:




QQ截图20130615171445.jpg (22.51 KB, 下载次数: 0)

计算结果

计算结果

点评

不断解决新的问题才是学习的重中之重...  发表于 2013-6-15 18:28
回复 使用道具 举报
Heart 中级黑马 2013-6-15 18:27:24
65#
Heart 发表于 2013-6-15 17:34
【运行结果】如下:

思路走过了,以前这个问题做过,所以不难
回复 使用道具 举报
这个结果对吗?
  1. /**
  2. *题目:猜一猜猴子摘了多少桃子呢?
  3. *猴子吃桃的问题:猴子第一天摘下来N个桃子,当天就吃了一半,但是还不过瘾,又多吃了一个,第二天早上又将
  4. *剩下的桃子吃了一半,又多吃了一个,以后每天早上都吃了前一天剩下的一半零一个,到第十天早上的时候就发现剩下
  5. *一个桃子了.求第一天一共摘下了多少桃子呢?
  6. *思路:1、猴子当天吃的和次天吃的桃子数是变量。
  7. *    2、第二天剩的桃子,是前一天的一半减一,已知最后一天剩一个,可以往前推算。
  8. *步骤1、定义最后一天剩1个i2=1,初始化倒数第二天i1=0。
  9.      2、前一天桃子的数量是第二天加一个再2倍的数量。
  10. * */
  11. public class Monkey {
  12.         public static void main(String[] args) {
  13.                 //定义i1为第一天吃的桃子数量,i2为次天吃的桃子数量,day为天数
  14.                 int i1 = 0;
  15.                 int i2 = 1;//最后一天只剩1个
  16.                 //定义day第10天
  17.                 for(int day=9; day>0; day--) {
  18.                         i1 = (i2+1) *2;//因为次天剩的是前一天的一半再减一个,即/2-1。
  19.                                                     //所以前一天是次天的加一个的2倍,即+1 *2。
  20.                         i2=i1;//前一天变次天,往前推进
  21.                 }
  22.                 System.out.println(i1);//最初桃子数量
  23.                
  24.         }
  25. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
孙百鑫 + 2 赞一个!

查看全部评分

回复 使用道具 举报
我做出来了
  1. class Demo2
  2. {
  3.         /*基本思路:
  4.          * 可以把顺倒过来,正序是每天吃一半多一个,第十天开始发现剩余一个,说明上面的过程重复了9遍
  5.          * 倒序的话本来一个,每一天加上一个再乘以2,循环9次
  6.          * for循环,循环9次,每次都是在上次基础上加1乘以2.第一次是1加上1乘以2
  7.          * */
  8.         public static void main(String[] args) {
  9.                 //第十天剩余1个桃子
  10.                 int num=1;
  11.                 for (int i = 0; i < 9; i++) {
  12.                         //每次加上1,再乘以2
  13.                         num=(num+1)*2;
  14.                 }
  15.                 //输出结果
  16.                 System.out.println(num);
  17.         }
  18. }
复制代码
结果:
回复 使用道具 举报
这个是结果!

QQ图片20130615183041.jpg (13.83 KB, 下载次数: 0)

运行结果

运行结果
回复 使用道具 举报

上传图片,结果附件没有确认插入,截图如下





评分

参与人数 1技术分 +2 收起 理由
孙百鑫 + 2

查看全部评分

回复 使用道具 举报
看看是什么题目
回复 使用道具 举报
我来看看啊
回复 使用道具 举报
class ZhuanFen
{
public static void main(String[] args)
{
  
  int count = 1;//最后一天剩下的桃子数,并用它来当计数器记录前一天的桃子数
  
  for (int x=0;x<8 ;x++ )//因为是第十天早上发现桃子只有一个 所以第九天早上吃完后就剩1个桃子了,所以要循环9次。
  {
   count = (count+1)*2;//计算前一天的桃子数,并用计数器记录
  }
  System.out.println(count);
  
}
}

点评

重新走一遍思路,还差一点  发表于 2013-6-15 20:36
回复 使用道具 举报
提交代码,查看题目大概在二十六分钟前(系统说的)。
  1. public class Test11 {
  2. /**
  3. * 猴子吃桃的问题:猴子第一天摘下来N个桃子,当天就吃了一半,但是还不过瘾,又多吃了一个,第二天早上又将
  4.         剩下的桃子吃了一半,又多吃了一个,以后每天早上都吃了前一天剩下的一半零一个,到第十天早上的时候就发现剩下
  5.         一个桃子了.求第一天一共摘下了多少桃子呢?
  6.         
  7. * 分析:如下,前一天吃掉的一半,在吃去一个,就是第二天的。可以有下的公式。      
  8. * a(n) = a(n-1)/2-1;
  9. * a(n-1) = 2[a(n)+1] 那么根据这个公司,可以根据后一天推算出前一天的,叠加出天数。就可以。
  10. */
  11.         public static void main(String[] args) {
  12.                 System.out.println(getNum(10));//1534
  13.         }
  14.         public static int getNum(int day){
  15.                 //第十天剩下的1个。
  16.                 int count = 1;
  17.                 //根据公式,前一天,等于后一天的数目的二倍加上两个。循环天数,最终可以算出第一天的。
  18.                 for(int i= 1;i<day;i++){
  19.                         count = 2*count +2;
  20.                 }
  21.                 //返回第一天的数目。
  22.                 return count;
  23.         }
  24. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
夜默 + 2 超时,运用递归,注释详细

查看全部评分

回复 使用道具 举报
两位版主,请教一个问题一下,因为对递归调用这块不是怎么熟悉,就这道题而言,如果用递归的方法,怎么能正确返回最后的值啊,意思就是只打印第一天的值,其它天数的不打印出来,我试了几次都木有能正确返回来,请问你们有木有比较好的方法啊?
  1. /*
  2. 题目:猜一猜猴子摘了多少桃子呢?
  3. 猴子吃桃的问题:猴子第一天摘下来N个桃子,当天就吃了一半,但是还不过瘾,又多吃了一个,第二天早上又将
  4. 剩下的桃子吃了一半,又多吃了一个,以后每天早上都吃了前一天剩下的一半零一个,到第十天早上的时候就发现剩下
  5. 一个桃子了.求第一天一共摘下了多少桃子呢?

  6. 思路:1、此题是一个数学推理题,可以采用逆向思维进行推理,先定义一个方法用表达式表示出第九天的结果;
  7.           2、利用递归原理调用计算方法,这样即可得到计算结果。

  8. 步骤:1、定义一个类,把主函数和计算方法定义在这个类中即可。
  9.           2、定义计算方法及利用递归原理进行调用计算出结果。
  10.           3、定义主函数,调用方法即可得到计算结果。
  11. */
  12. class Demo
  13. {
  14.         public static void jiSuan(int i,int j)//定义计算方法
  15.         {
  16.                 int sum=j;
  17.                 System.out.println("第"+i+"天有"+sum+"个桃子");[color=Red]//这里打印出来的是每天的数值,请问在递归中有什么方法能只打印第一天的数值啊[/color]
  18.                 sum=(sum+1)*2;
  19.                 i--;
  20.                 if(i>0)
  21.                         jiSuan(i,sum);//递归调用
  22.         }       
  23.         public static void main(String[] args)
  24.         {
  25.                 jiSuan(10,1);//调用计算方法
  26.         }
  27. }
复制代码
回复 使用道具 举报
public class Demo {
    public static void main(String[] args) throws Exception {
         //第十天的桃子,做为基数
          int x = 1;

       //变化从九天开始,时间倒流计算
       //第十天是1个,那么在它的基础加多吃一个,再这个基础上还有一半,那么就乘2,就是当天最多的桃子数量
       for (int i = 9; i >0; i--) {
                x=(x+1)*2;   
        //System.out.println(x);
         }
    System.out.println("第一天一共摘了"+x+"个桃子");
    }
}

11.jpg (4.03 KB, 下载次数: 0)

11.jpg

评分

参与人数 1技术分 +2 收起 理由
夜默 + 2 赞一个!

查看全部评分

回复 使用道具 举报
孙柏鑫你什么时候成了版主了
回复 使用道具 举报
class  ChiTaoTest2
{
        public static void main(String[] args)
        {
       
                System.out.println("猴子第一天摘的桃子数是:"+taozi(10));//打印10天前桃子总数
        }
               
        public static int taozi(int days)//定义一个函数求days天前的桃子总数
        {
                int sum;          //定义一个sum接收桃子总数
               
                if(days==1)       //最后一天桃子数是1
                        sum=1;
                else
                        sum=2*(taozi(days-1)+1);  //前一天桃子数是当天桃子数加1后的2倍
                return sum;
        }
               
}

评分

参与人数 1技术分 +3 收起 理由
夜默 + 3

查看全部评分

回复 使用道具 举报
看看题目。。。。
回复 使用道具 举报
  1. /**
  2. 需求:猴子吃桃的问题:猴子第一天摘下来N个桃子,当天就吃了一半,但是还不过瘾,又多吃了一个,第二天早上
  3. 又将剩下的桃子吃了一半,又多吃了一个,以后每天早上都吃了前一天剩下的一半零一个,到第十天早上的时候
  4. 就发现剩下一个桃子了.求第一天一共摘下了多少桃子呢?

  5. 思路:
  6. 从这个文字的描述看,这个系统中包含的对象可以有猴子、桃子、桃子集合,整个系统发生的事情就是猴子
  7. 摘桃子、吃桃子,最后需要知道猴子第一天摘了多少桃子。如果把这个系统用计算机描述出来,并模拟系统
  8. 的运行,是可以知道猴子第一条摘多少桃子的。因为开始不知道猴子摘了多少桃子,所以只能逆着模拟系统
  9. 的正常情况来模拟运行。


  10. 步骤:
  11. 1.系统要运行需要桃子仓库,用来保存桃子,桃子仓库用可以动态增删元素的集合来表示
  12. 2.还需要猴子,猴子要有吃桃子的行为,由于是逆着模拟系统,所以根据当天剩余的桃子数量可以计算出当
  13. 天猴子吃掉的桃子,然后把猴子吃掉的保存进桃子仓库,这样就得到了上一天的仓库的桃子剩余数量,一直
  14. 递归调用猴子吃桃,直到 10 天前
  15. 3.把猴子吃掉10天后桃子仓库的数量打印出来就是猴子摘的桃子的总量
  16. */
  17. import java.util.*;

  18. class MonkeyAndPeachMain
  19. {
  20.     public static void main(String[] args)
  21.     {
  22.         LinkedList<Peach> peachStorage = new LinkedList<Peach>();
  23.         Monkey monkey = new Monkey();

  24.         peachStorage.add(new Peach());  //因为最后一天还剩一个桃,所以先把仓库里面放一个桃子
  25.         monkey.eatPeach(peachStorage, 1);

  26.         System.out.println("猴子总共摘了 " + peachStorage.size() + " 个桃子");
  27.     }
  28. }

  29. class Monkey
  30. {
  31.     /**
  32.      * @param peachStorage  桃子仓库
  33.      * @param day           猴子吃桃的天数
  34.      */
  35.     public void eatPeach(LinkedList<Peach> peachStorage, int day)
  36.     {
  37.         if(day >= 10)
  38.         {
  39.             return;
  40.         }
  41.         else
  42.         {
  43.             int currentPeachAcount = 0;
  44.             int peachStorageSize = peachStorage.size();
  45.             while(currentPeachAcount < (2*(peachStorageSize+1)-peachStorageSize))
  46.             {
  47.                 peachStorage.add(new Peach());
  48.                 currentPeachAcount++;
  49.             }
  50.             eatPeach(peachStorage, day+1);
  51.         }
  52.     }
  53. }

  54. class Peach
  55. {
  56. }
复制代码
实在调不好这个代码的缩进,我勒个去。


评分

参与人数 1技术分 +3 收起 理由
夜默 + 3 很给力!

查看全部评分

回复 使用道具 举报
mulua 中级黑马 2013-6-15 20:15:04
80#
好活动    多多举办
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马