小东和三个朋友一起在楼上抛小球,他们站在楼房的不同层,假设小东站的楼层距离地面N米,球从他手里自由落下,每次落地后反跳回上次下落高度的一半,并以此类推直到全部落到地面不跳,求4个小球一共经过了多少米?(数字都为整数)
给定四个整数A,B,C,D,请返回所求结果。
测试样例:
100,90,80,70
返回:1020
没有数学分析到可以用极限,但是递归还是解决问题了public int calcDistance(int A, int B, int C, int D) { double len=0; len+=getLen(A*1.0,0); len+=getLen(B*1.0,0); len+=getLen(C*1.0,0); len+=getLen(D*1.0,0); return (int) Math.round(len); } private double getLen(double a,double sum) { if (a<=0) { return sum; } sum+=a+a/2; return getLen(a/2, sum); }
// 数学题,求极限 import java.util.*; public class Balls { public int calcDistance(int A, int B, int C, int D) { // write code here return 3*(A+B+C+D); } }
/** * 迭代 * @param A * @param B * @param C * @param D * @return */ public int calcDistance(int A, int B, int C, int D) { return (int)Math.round(countDis(A*1.0)+countDis(B*1.0)+countDis(C*1.0)+countDis(D*1.0)); } /** * * @param a * @return */ private double countDis(double a) { double dis = a; while (a > 0) { a /= 2.0; dis += 2*a; } return dis; }
int calcDistance(int A, int B, int C, int D) { // write code here int res = 0; while(A) { res += A; A /= 2; res += A; } while(B) { res += B; B /= 2; res += B; } while(C) { res += C; C /= 2; res += C; } while(D) { res += D; D /= 2; res += D; } return res; } 请问这段代码哪里有问题吗? 我输出的是996 好像不对啊 思路哪里错了吗? 改成了 double res = 0; double a = A; double b = B; double c = C; double d = D; while(a) { res += a; a /= 2; res += a; } while(b) { res += b; b /= 2; res += b; } while(c) { res += c; c /= 2; res += c; } while(d) { res += d; d /= 2; res += d; } return res + 0.5; 就通过了...
classBalls {public:intcalcDistance(intA, intB, intC, intD) {// write code herereturn 3*(A+B+C+D);}};
import java.util.ArrayList; import java.util.List; public class Main { public static int calcDistance(int A, int B, int C, int D) { return ballDistance(A) + ballDistance(B) + ballDistance(C) + ballDistance(D); } // 计算每个小球会经过多少米 public static int ballDistance (int N) { // 每次反弹多少米 List<Double> disList = new ArrayList<Double>(); disList.add(0.0); // 第 0 次,没扔球,不反弹 double n = N; while (n != 0) { n = n / 2.0; disList.add(n); } // 反弹的次数 int count = disList.size(); double[] rs = new double[count]; rs[0] = N; for (int i = 1; i < count; i ++) { rs[i] = rs[i - 1] + disList.get(i) + disList.get(i - 1); } int distance = (int) Math.round(rs[count - 1]); return distance; } public static void main(String[] args) { int rs = calcDistance(100, 90, 80, 70); System.out.println(rs); } }
// 画图可知,假设开始时距地面N米,这N米的过程只经过1次,接下来的过程是弹起来N/2再 // 落下N/2,弹起来N/4再落下N/4...因此,总的路程S=N+2N(1/2+1/4+1/8+...)=N+N(1+1/2+1/4+1/8+...)。由等比数列的求和公式,当数列长度趋于无穷时,S=3N。 import java.util.*; public class Balls { public int calcDistance(int A, int B, int C, int D) { // write code here return 3*(A+B+C+D); } }