Java 这道小题的错误在哪
问题描述
/* * 一球从100米高度自由落下,每次落地后反跳回原来高度的一半,再落下, * 求它在第10次落地时共经过多少米?第10次反弹多高? * */修改的地方都加粗了public class Demo { public static void main(String[] args){//小球反弹后的高度double height = 100;//y用于记录小球下落的高度double y = 0;//小球经过的总路程**double sum = 0;**for(int i =1;i<=10;i++){ //记录小球落下的高度 y = height ; //小球每次反弹后的高度 height = (**1.0**/2)*height; //因为第10次反弹的高度是不用加的 if(i<=9){//小球的总路程sum =y+height; }}System.out.println('共经过'+sum+'米');System.out.println('第10次反弹的高度是:'+height+'米'); }}
问题解答
回答1:height = (1/2)*height ; 应为 height = (1.0/2)*height ;, 否则它的值恒为 0.
因为 数值运算的类型转换,导致整数的除法的结果也为整数, 所以 1/2的结果为 0, 而不是 0.5.
还有 y 每次循环都重置了. 改为:
public class Demo { public static void main(String[] args){//小球的高度double height = 100;//小球经过的距离double y = 0;for(int i=1;i<=10;i++){ //记录小球每次往下落的距离,球弹起和下落,所以 height * 2 y = y + height*2; //反弹的高度 height = (1.0/2)*height ;}// 第一次落地没有经历弹起过程,需减掉初始高度y = y - 100;System.out.println('共经过'+y+'米');System.out.println('第10次反弹的高度是:'+height+'米'); }}回答2:
y = height 每次循环都重置了 y 值,哪里是在累加……
JavaScript 代码算法示意
var height = 100var sum = height;for (var i = 2; i <= 10; i++) { sum += height; height /= 2}// sum == 299.609375,即总路程// 最后一次是第10次弹起再下落的总长,所以再除以2才是弹起的高度height /= 2; // 0.09765625回答3:
所以代码可以这样写public class Demo {
public static void main(String[] args){ //小球的高度 double height = 100; //第一次小球经过的距离 double y = height; //不算上第一次,到第10次还要经历9次 for(int i=1;i<=9;i++){ //反弹的高度每次都是前一次的一半height = (1/2)*height;//每一次弹跳往返都是高度的两倍y += height*2; } System.out.println('共经过'+y+'米'); System.out.println('第10次反弹的高度是:'+height+'米');}
}
相关文章: