PTA 7-3高空坠球问题

高空坠球问题考察到了循环语句的运用

以下为原题内容:

———————————————————————————————————————————

题目:

皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?

输入格式:

输入在一行中给出两个非负整数,分别是皮球的初始高度和n,均在长整型范围内。

输出格式:

在一行中顺序输出皮球第n次落地时在空中经过的距离、以及第n次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。

———————————————————————————————————————————

以下为我自己的解题思路:

依题意可知,

重点一:每次反弹高度减半,因此循环语句内部应该是高度自除2;

重点二:第N次落地时在空中经过的距离,应该是每次“反弹前”的高度累加(第i次反弹后到i+1次反弹前经过两次第i次反弹的高度,其路程总长即第i-1次反弹小球的反弹高度,此处仅适用减半反弹,若为三分一高度或者其他高度的话应该修改为先减小反弹高度,再将其乘2和路程相加);

重点三:输入的数据为长整型非负整数,而输出为double型且保留一位小数,要转换格式并且格式化输出一位小数的结果

———————————————————————————————————————————

以下为测试代码:

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        long i,height,n;
        Scanner reader=new Scanner(System.in);
        height=reader.nextLong();n=reader.nextLong();
        double high=height,N=n,route=high;//转换格式
        for(i=0;i<n;i++){
            route+=high;//经过路程自增
            high/=2;//反弹高度减半
        }
        System.out.printf("%.1f %.1f",route,high);//格式化输出
    }
}

运行结果:

评估:

运算结果出错,正确答案应该是94.9和1.0;

推测最后一次循环时,将反弹的高度再次与路程相加,导致错误

———————————————————————————————————————————

以下为第一次debug后代码:

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        long i,height,n;
        Scanner reader=new Scanner(System.in);
        height=reader.nextLong();n=reader.nextLong();
        double high=height,N=n,route=high;//转换格式
        for(i=0;i<n;i++){
            if(i==n-1){
                high/=2;//反弹高度依旧自除2,但是路程不增
                break;
            }
            route+=high;//经过路程自增
            high/=2;//反弹高度减半
        }
        System.out.printf("%.1f %.1f",route,high);//格式化输出
    }
}

运行结果:

尝试提交PTA:

第二次评估:

未考虑到N=0时(不反弹)路程和反弹高度均为0的情况

———————————————————————————————————————————

以下为第二次debug后的代码:

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        long i,height,n;
        Scanner reader=new Scanner(System.in);
        height=reader.nextLong();n=reader.nextLong();
        double high=height,N=n,route=high;//转换格式
        for(i=0;i<n;i++){
            if(i==n-1){
                high/=2;//反弹高度依旧自除2,但是路程不增
                break;
            }
            route+=high;//经过路程自增
            high/=2;//反弹高度减半
        }
        if(n==0){
            high=0;
            route=0;
        }    
        System.out.printf("%.1f %.1f",route,high);//格式化输出
    }
}

提交PTA后结果:

总结:

考虑情况时要在最大值和最小值的地方小心,这些地方的结果可能不满足循环内的逻辑,因此要单独做判断

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值