高空坠球问题考察到了循环语句的运用
以下为原题内容:
———————————————————————————————————————————
题目:
皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第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后结果:
总结:
考虑情况时要在最大值和最小值的地方小心,这些地方的结果可能不满足循环内的逻辑,因此要单独做判断