[编程题] 小球的距离
小东和三个朋友一起在楼上抛小球,他们站在楼房的不同层,假设小东站的楼层距离地面N米,球从他手里自由落下,每次落地后反跳回上次下落高度的一半,并以此类推知道全部落到地面不跳,求4个小球一共经过了多少米?(数字都为整数)
给定四个整数A,B,C,D,请返回所求结果。
测试样例:
100,90,80,70
返回:1020
解法一:
刚开始做这个题收到了括号里 数字都为整数 的误导,以为 落地距离是5米,弹起后2米(5/2自动取整)。算出来结果不对,变小了。所以,不是自动取整。就是所有的都算进去,这就牵扯到数学上的极限思想了。除了最开始的下落高度只加一次外,以后的弹起下落都是两倍的距离。举个例子,下落高度是x米
,则有下落后弹起的高度是x/2,再落下去,又走了一个x/2,依此类推,一直下去,也就是总距离为 x+2*x(1/2+1/4+1/8+……),而括号中的数列是一个等比数列,其极限求和的结果就是1。所以 总距离就是3*x。推理到这里,就发现写程序只需要一行关键代码就可以。
classBalls {
public:
intcalcDistance(intA, intB, intC, intD) {
// write code here
return3*(A+B+C+D);
}
};
解法二:
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;
就通过了...
第二次做:
class Balls {
public:
int calcDistance(int A, int B, int C, int D) {
// write code here
double da = A ;
double db = B ;
double dc = C ;
double dd = D ;
double result = 0.0 ;
while ( da ) {
result += da + ( da / 2 ) ;
da /= 2 ;
}
while ( db ) {
result += db + ( db / 2 ) ;
db /= 2 ;
}
while ( dc ) {
result += dc + ( dc / 2 ) ;
dc /= 2 ;
}
while ( dd ) {
result += dd + ( dd / 2 ) ;
dd /= 2 ;
}
return ceil( result ) ;
}
};