黑马程序员技术交流社区

标题: 有些不懂 帮小弟详细讲解一下 [打印本页]

作者: gjggw123    时间: 2013-5-19 09:55
标题: 有些不懂 帮小弟详细讲解一下
一球从100米高度自由落下,每次落地后又反跳回原高度的一半;再落下,求它第10次落地时共经过多少米.第十次反弹多高...public static void main(String args[]){      double a =100;   double b =a/2;   int i =0;   for (i =2;i<=10;i++){    a = a+b*2;    b = b/2;   }System.out.println("第"+i+"次落地经过时"+"共"+a+"米");    System.out.println("第"+i+"次落地时"+"共反弹"+b+"米");请问一下 为什么i=2?我没有看懂..我算出来的结果是第11次经过和弹起 可是我算的是第10次啊 怎么搞的但是 答案还对 我有点迷糊了..还有a=a+b*2也不怎么懂..希望明白人 帮小弟详细讲解一下
作者: 刘治广    时间: 2013-5-19 10:32
a=a+b*2  就是b先乘2 在加a然后赋值给a
作者: 神之梦    时间: 2013-5-19 10:44
楼主先从如果问题是从第二次落地经过多少米,反弹多高来开始想。
i=2,因为作者的思路是从球第一次落地,还没弹起时,来作为计数的节点,因为不管你要算第几次落地,肯定不是停在空中,而而是落到地上就停止去计数。这里不设为1,是为了计数的方便。
a=a+b*2;其中的a楼主应该明白吧,b就是反弹的高度,但是反弹加落下,这里球要经历两个相同的距离,所以b*2,
因为题目问的是,第十次反弹多高?而在for循环中,是当i++这个语句完成后大于10才结束,所以打印的结果就成了第11次,我觉得这里在打印是改为i--会比较好。
作者: bushangkoukou    时间: 2013-5-19 11:27
本来  想画个图给楼主,怎奈小弟的画图水平有限啊,还是文字说明吧。
首先要清楚 i 是用来表示什么的   
还有就是它每一次落下弹起的高度是算哪些距离

第一次落下    经过的距离a=100    弹起高度b=50

这个很好理解吧

第二次落下   经过的距离a+b+b=200 弹起高度b=25
注意此时已经体现出那个循环中的表达式了
                          a=a+2b    b=b/2
另注意这时候已经把经过的距离赋值给了a
此时的a不是落下的高度了

第三次落下 经过的距离a=a+2b  b=b/2

像我这样列举三次之后,你就会明白这个a=a+2b的含义,另外你也会发现i是代表次数,i为0和1的时候经过的距离是不符合这个表达式了,你就明白为什么i要从2开始计数了,希望你可以清晰的理解。

无11111111111111111111111111题.jpg (26.81 KB, 下载次数: 0)

无11111111111111111111111111题.jpg

作者: 刘胜寒    时间: 2013-5-19 11:31
我想这个可以结贴了。楼主怎么看
作者: bushangkoukou    时间: 2013-5-19 11:32
bushangkoukou 发表于 2013-5-19 11:27
本来  想画个图给楼主,怎奈小弟的画图水平有限啊,还是文字说明吧。
首先要清楚 i 是用来表示什么的   
还 ...

额。。好吧。没想到是这个效果,不好意思了
作者: 乐行者广裁    时间: 2013-5-19 11:42
float n,s,h=100,i=2;
system.out.println("弹跳次数:\n");
scanf("%d",&n);
    while(i<=n)
        {
        h=h/2;
        s=h+h/2:
                  i++;
        }
system.out.println("h=%.5f s=%.5f\n",h,s);




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