黑马程序员技术交流社区

标题: 问大家一个问题关于100米小球的 [打印本页]

作者: 浪死歌    时间: 2015-5-9 16:53
标题: 问大家一个问题关于100米小球的
一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?

自己网上找了个的程序。但是验证了一下不对
第一次落地经过100米第二次落地经过 100+50+50 应该是二百米
可程序运行结果不对,大神指点一下怎么改

这是网上找的 运行结果不对
import java.util.Scanner;
public class Prog10{
        public static void main(String[] args){
                System.out.print("请输入小球落地的次数:");
                Scanner scan = new Scanner(System.in);
                int h = 100;
                int n = scan.nextInt();
                scan.close();
                distance(h,n);
        }
        //小球从h高度落下,经n次反弹后经过的距离和反弹的高度
        private static void distance(int h,int n){
                double length = 0;
                for(int i=0;i<n;i++){
                        length += h;
                        h /=2.0 ;
                }
                System.out.println("经过第"+n+"次反弹后,小球共经过"+length+"米,"+"第"+n+"次反弹高度为"+h+"米");
        }
}

作者: DonaldLove    时间: 2015-5-9 17:00
length初始值是100  再试下
作者: rolan    时间: 2015-5-9 17:03
  1. package com.wang.romantiskt;
  2. //1.编程一个球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?  
  3. /*1             2           3             4
  4. 100+100/2   50+50/2     25.5+25.5/2     .....*/

  5. public class Text3 {
  6.         public static void main(String[] args){
  7.                 double sum=0;
  8.                 double len=100;
  9.         
  10.                 for(int i=1;i<=10;i++){//分析如上面所示
  11.                    sum+=len/2+len;
  12.                    len=len/2;
  13.                         
  14.                 }
  15.                 System.out.println(sum);
  16.                 System.out.println(len);
  17.         }
  18. }
复制代码

楼主你这里就是逻辑错误了,分析的方式不太对
就从题面上可知是不可能超过200的 第一次落下100+100/2  第二次50+50/2  第三次25.5/2+25.5  写到这里你就能发现规律
作者: 浪死歌    时间: 2015-5-9 17:07
感觉是循环哪里有问题,应该是 与第一次相同,但是不会改代码

作者: 浪死歌    时间: 2015-5-9 17:10
rolan 发表于 2015-5-9 17:03
楼主你这里就是逻辑错误了,分析的方式不太对
就从题面上可知是不可能超过200的 第一次落下100+100/2  第 ...

可我看到的题是 当小球落地时 他经过的路程
作者: 浪死歌    时间: 2015-5-9 17:12
DonaldLove 发表于 2015-5-9 17:00
length初始值是100  再试下

试了一下 length的初始值改为100后 第一次落地经过200米 第二次是250米 肯定不对
作者: 浪死歌    时间: 2015-5-9 17:14
DonaldLove 发表于 2015-5-9 17:00
length初始值是100  再试下

试了一下length的初始值改为100后,第一次落地经过200米,第二次是250米,肯定不对。
作者: 浪死歌    时间: 2015-5-9 17:15
求大牛帮改代码
作者: yky1678    时间: 2015-5-9 17:38
分析思路如下:
     第1次落下后走的距离f(1)=100
      第2次落下后走的距离f(2)=f(1)+50+50=f(1)+f(1)/2^0
      第3次落下后走的距离f(3)=f(2)+25+25=f(2)+f(1)/2^1
      第4次落下后走的距离f(4)=f(3)+25/2+25/2=f(3)+f(1)/2^2
      第n次落下后走的距离f(n)=f(n-1)+f(1)/2^(n-2)    (n>=2)

采用递归调用,就能够出结果了。

作者: DonaldLove    时间: 2015-5-9 17:40
看到了 h变量不能是整型的 换成double就可以了
作者: 弯曲/mg抛物☀    时间: 2015-5-9 17:44
package com.itheima;

public class Test2 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
//                次数
                int count = 200 ;
//                初始高度
                float startHigh = 30;
//                获取多少次后的高度
                getHigh(count, startHigh);
                System.out.println(getHigh(count, startHigh));
        }

        private static float getHigh(int count, float startHigh) {
//                多少次后的高度
                float endHigh = 0;
//                运动的距离,
                float S = 0;
//                临时存储
                float temp ;
                temp = startHigh;
                for(int i=0; i < count; i++) {
                        endHigh = startHigh / 2;
                        S += startHigh*2;
                        startHigh = endHigh;
                }
                System.out.println(" 球所走的距离:"+(S-temp));
                return endHigh;
        }

}

作者: 弯曲/mg抛物☀    时间: 2015-5-9 17:45
我写的,看看
作者: 浪死歌    时间: 2015-5-9 17:48
弯曲/mg抛物☀ 发表于 2015-5-9 17:44
package com.itheima;

public class Test2 {

厉害~~~
作者: 浪死歌    时间: 2015-5-9 17:50
yky1678 发表于 2015-5-9 17:38
分析思路如下:
     第1次落下后走的距离f(1)=100
      第2次落下后走的距离f(2)=f(1)+50+50=f(1)+f(1)/ ...

递归还没有学呀 不会用
作者: ninjaes    时间: 2015-5-9 17:55
我直接用的是 求你平方的  pow()方法
作者: ninjaes    时间: 2015-5-9 17:57
for(y=1;y<=10;y++)
                 {
                         double c=Math.pow(2,y-1);
                         if(y==1)
                            f=100;
                         else
                      f=200/c+f;
                  System.out.println("第"+y+"次的距离是"+f);
                 }
作者: yky1678    时间: 2015-5-9 17:57
浪死歌 发表于 2015-5-9 17:50
递归还没有学呀 不会用

给你看下代码,我的代码中100就直接用了,没有定义成变量,不过不影响

  1.   public static double func(int n){
  2.                         if(n==1){
  3.                                 return (double)100;
  4.                         }else{
  5.                                 return func(n-1)+(double)func(1)/Math.pow(2,n-2);
  6.                         }
  7.                 }
复制代码

作者: yuanhnu    时间: 2015-5-9 22:44
rolan 发表于 2015-5-9 17:03
楼主你这里就是逻辑错误了,分析的方式不太对
就从题面上可知是不可能超过200的 第一次落下100+100/2  第 ...

for里面代码要改成:sum+=len;
len/=2.0;
作者: LPStone    时间: 2015-5-9 22:52
  1. /*
  2. 1.编程一个球从100米高度自由落下,每次落地后反跳回原高度的一半;
  3. 再落下,求它在   第10次落地时,共经过多少米?第10次反弹多高?
  4. */
  5. class Test1
  6. {
  7.         public static void main(String[] args)
  8.         {
  9.                 //小球经过的路程,第一次落地经过路程确定为100米
  10.                 float  Journey = 100.0f;
  11.                 //小球弹起的高度,起始高度确定为100米
  12.                 float  High = 100.0f;

  13.                 //从第1次触地开始,到往后每一次触地的计算               
  14.                 for (int i = 2;i <= 10;i++ )
  15.                 {               
  16.                         Journey += High;//路程累加
  17.                         High = High/2.0f;//反弹高度减半
  18.                 }

  19.                 //第2次触地即是第1次反弹结束,即第10次触地即是第9次反弹结束
  20.                 High = High/2.0f;

  21.                 System.out.println("小球第10次落地时,共经过" + Journey + "米!" );
  22.                 System.out.println("小球第10次反弹" + High + "米!" );
  23.         }
  24. }
复制代码

作者: KK要有光    时间: 2015-5-9 23:38
LPStone 发表于 2015-5-9 22:52

落下时共经过多少米这一问得乘以2吧,journey=journey+high*2.因为从第一次着地弹起加落下以后每次都是相同的一组动作,是两段相同的距离。
作者: LPStone    时间: 2015-5-10 09:56
KK要有光 发表于 2015-5-9 23:38
落下时共经过多少米这一问得乘以2吧,journey=journey+high*2.因为从第一次着地弹起加落下以后每次都是相 ...

是的 但是首先你的high得先除以2,然后在乘以2,所以我把除以2放后面了 你可以运行一下看看结果
作者: zy18692243338    时间: 2015-5-10 12:11
第一题:
class  Deom11
{
         public static void main(String[] args)
        {
                 double num=100;
                 int i=0;
                 double a=100;
                 while (i<11)
                 {
                         a/=2;
                         i++;
                         num+=a;
                 }
                 System.out.println("第10次落地时,共经过了"+num+"米");
                 System.out.println("第10次反弹"+a+"米");
         }
}

作者: KK要有光    时间: 2015-5-10 14:16
LPStone 发表于 2015-5-10 09:56
是的 但是首先你的high得先除以2,然后在乘以2,所以我把除以2放后面了 你可以运行一下看看结果 ...

嗯嗯,你是对的。
作者: lzh2015    时间: 2015-5-10 14:31
import java.util.Scanner;

public class BallDown {

        public static void main(final String[] args) {
                double sum = 0;
                double high = 100;
                Scanner sc = new Scanner(System.in);
                System.out.println("你想知道小球第n次落地时经过的距离和之后反弹高度,就输入数字n");
                int n = sc.nextInt();
                for (int x = 1; x <= n; x++) {
                        sum += (high * 2);
                        high /= 2;
                }
                System.out.println("第" + n + "落地时小球经过的距离是" + (sum - 100) + "m");
                System.out.println("第" + n + "次落地后反弹高度是" + high + "m");
                sc.close();
        }
}

作者: 浪死歌    时间: 2015-5-10 22:00
LPStone 发表于 2015-5-9 22:52

恩程序中  float 我都没用过~~~




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