黑马程序员技术交流社区

标题: 如题,编程题 [打印本页]

作者: sam9204    时间: 2015-5-14 11:49
标题: 如题,编程题
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
第10次落地时,共经过多少米?第10次反弹多高?

作者: hzhzhen    时间: 2015-5-14 11:49
public class Main {
private double TotalHeight = 100;
private double CurHeight = 50;

public void drop(int times) {
if ((times - 1) == 0) {
return;
}

setTotalHeight(getTotalHeight() + 2 * getCurHeight());
setCurHeight(getCurHeight() / 2);

drop(times - 1);
}

public double getTotalHeight() {
return TotalHeight;
}

public void setTotalHeight(double totalHeight) {
TotalHeight = totalHeight;
}

public double getCurHeight() {
return CurHeight;
}

public void setCurHeight(double curHeight) {
CurHeight = curHeight;
}

public static void main(String[] args) {
Main main = new Main();
main.drop(2);
System.out.println("Total height is " + main.getTotalHeight());
System.out.println("Current height is " + main.getCurHeight());
}
}

作者: CoeusLYJ    时间: 2015-5-14 12:59
  1. public class Question3 {
  2. /*需求:一球从100米高度自由落下,每次落地后反跳回原高度的一半;
  3. * 再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
  4. */
  5.         public static void main(String[] args) {

  6.                 double meter=getMeter(100.0,10.0);
  7.                 System.out.println(meter); //运行结果:0.09765625
  8.                 double sum_meter=getSumMeter(100.0,10.0);
  9.                 System.out.println(sum_meter);  //运行结果97.0

  10.         }
  11.         /**
  12.          * 定义一个方法,根据指定高度、落地次数,确定其反弹多高
  13.          * @param height 高度
  14.          * @param num 落地次数
  15.          * @return 经num之后,球最终所在高度
  16.          */
  17.         public static double getMeter(double height, double num) {
  18.                 if(num<0.0)
  19.                         return -1;
  20.                 if(num==0.0)
  21.                         return height;
  22.                
  23.                 for(int i=0;i<num;i++){
  24.                         height=height/2;
  25.                 }               
  26.                 return height;
  27.         }
  28.         /**
  29.          * 定义一个方法,根据指定高度、落地次数,确定其反弹多高
  30.          * @param height 高度
  31.          * @param num 落地次数
  32.          * @return 经num之后,球经过的距离
  33.          */
  34.         public static double getSumMeter(double height, double num) {
  35.                 if(num<0.0)
  36.                         return -1;
  37.                 if(num==0.0)
  38.                         return 0;
  39.                 int sum=0;
  40.                 for(int i=0;i<num;i++){
  41.                         height=height/2;
  42.                         sum+=height;
  43.                 }               
  44.                 return sum;
  45.         }
复制代码

作者: 464431789@qq.co    时间: 2015-5-14 13:31
本帖最后由 464431789@qq.co 于 2015-5-14 13:33 编辑

/*
        需求:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在

第10次落地时,共经过多少米?第10次反弹多高?

        分析:1因为需要计算球的高度、运动的长度、反弹次数,因此需要定义high,distance,count
2.第一次落地时,球运动的长度为其当前自由落体的高度 distance = high
                  2.第一次反弹的高度为 high = high/2,
                  3.第二次落地时,球运动的长度为其之前的运动的长度加上反弹的高度加上当前自由落体的高度 ,反弹的次数加1
                                distance = distance+high+high;
                                count++;
                  4.第二次反弹的高度为 high = high/2;
                  4.第二次落地时,球运动的长度为其之前的运动的长度加上反弹的高度加上当前自由落体的高度 ,反弹的次数加1
                                distance = distance+high+high;
                                count++;
                  6.经过10次落地,共经过多少米?反弹高度是多高?
                        for(int i = 1;i <= 10;i++) {
                                
                                if(i==1) {
                                        distance = high;
                                }else {
                                        high = high/2;
                                        distance = distance+high*2;
                                        count++;
                                }
                        }
*/

class FreeFall {
        public static void main(String[] args){
                //因为需要计算球的高度、运动的长度、反弹次数,因此需要定义high,distance,count
                double high = 100;//这是球每一次自由落体的高度,并给第一次自由落体的高度赋初值
                double distance = 0;//这是记录球运动的长度
                int count = 0;//这是记录球反弹的次数
               
                //经过10次落地,共经过多少米?反弹高度是多高?
                for(int i = 1;i <=10 ;i++) {
                        if(i==1) {
                                distance = high;
                        }else {
                                high = high/2;
                                distance = distance+high*2;
                                count++;
                        }
                }
                System.out.println("共经过"+distance+"米");
                System.out.println("第"+count+"次反弹的高度是:"+high+"米");
        
        }
}
作者: 白水丶    时间: 2015-5-14 14:03
第一落地为100,此时只需要一次,
当第二次反弹到50米并落下来时,相当于2个50
同理第三次反弹到25米并落下来时,相当于2个25
.. ...
这应该很好算了吧
作者: anoofeng    时间: 2015-5-14 22:50
本帖最后由 anoofeng 于 2015-5-14 22:57 编辑

class  fredomH
{
        public static void main(String[] args)
        {//设置高度h=100;反弹次数s=10;l为路程常;rh为反弹高度;
                double h=100;
                int s=10;
                double l=h,rh=h;

                for (int i=1; i<=s ; i++ )
                        {
                        rh*=0.5;
                        l+=(2*rh);
                        }                System.out.println("球自由落下一共经过"+l+"米。");
                System.out.println("球第"+s+"次反弹高度为"+rh+"米。");
        }
}

如果要控制高度和次数的话可以自己传入数字:


import java.util.Scanner;   //导包
class  fredomH
{
        public static void main(String[] args)
        {
                 //创建对象
                Scanner sa=new Scanner(System.in);
                System.out.println("请输入自由落体的高度:");
                 //引用
                Scanner sc=new Scanner(System.in);
                System.out.println("请输入自由落体的反跳次数:");
                double h=sa.nextDouble();
                int s=sc.nextInt();

                double l=h,rh=h;
               
                        if (s==0)
                        {
                                l=h;
                                rh=0;
                        }else{
                                for (int i=1; i<=s ; i++ )
                                        {
                                        rh*=0.5;
                                        l+=(2*rh);
                                        }
                        }
                        System.out.println("球自由落下一共经过"+l+"米。");
                        System.out.println("球第"+s+"次反弹高度为"+rh+"米。");
        }
}



作者: forplay    时间: 2015-5-15 16:27
楼上的思路不错。。。。。
作者: 等风继续吹    时间: 2015-5-15 22:46
受教了,有些思路了。集思广益啊
作者: sky930722    时间: 2015-5-20 10:37
受教了,楼上思路很棒。果然好的思路很重要




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