剣指Offer----拡張:小球を投げる(京東)
1024 ワード
問題の説明:
東さんは3人の友达と一緒に上の階でボールを投げて、彼らはビルの異なる階に立って、もし東さんの階が地面からNメートル離れていると仮定して、ボールは彼の手から自由に落ちて、着地するたびに前回の落下の高さの半分に戻って、そしてこのようにすべて地面に落ちて踊らないことを知っていて、4つのボールを求めて全部で何メートルを通りましたか?(数値はすべて整数)
4つの整数A,B,C,Dを与え、求めた結果を返してください.
テストサンプル:100,90,80,70
戻る:1020
分析:
実はこのテーマは罠があって、高度の計算の過程の中で整型を使うことができなくて、浮動小数点のタイプを使わなければならなくて、さもなくば精度の確実さをもたらしやすいです.
ソース:
実行結果:
東さんは3人の友达と一緒に上の階でボールを投げて、彼らはビルの異なる階に立って、もし東さんの階が地面からNメートル離れていると仮定して、ボールは彼の手から自由に落ちて、着地するたびに前回の落下の高さの半分に戻って、そしてこのようにすべて地面に落ちて踊らないことを知っていて、4つのボールを求めて全部で何メートルを通りましたか?(数値はすべて整数)
4つの整数A,B,C,Dを与え、求めた結果を返してください.
テストサンプル:100,90,80,70
戻る:1020
分析:
実はこのテーマは罠があって、高度の計算の過程の中で整型を使うことができなくて、浮動小数点のタイプを使わなければならなくて、さもなくば精度の確実さをもたらしやすいです.
ソース:
#include
#include
double calcTemp(int A)
{
if (A < 1)
return 0;
double A1 = (double)A;
double sum = A1;
while (A1)
{
sum += A1;
A1 /= 2;
}
return sum;
}
int calcDistance(int A, int B, int C, int D)
{
double A1 = calcTemp(A);
double B1 = calcTemp(B);
double C1 = calcTemp(C);
double D1 = calcTemp(D);
return A1 + B1 + C1 + D1 +0.5;
}
int main()
{
printf("%d
", calcDistance(100, 90, 80, 70));
printf("%s %s
", __DATE__, __TIME__);
system("pause");
return 0;
}
実行結果:
1020
Aug 29 2016 11:07:48
. . .