小东和三个朋友一起在楼上抛小球,他们站在楼房的不同层,假设小东站的楼层距离地面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);
}
}