剣指Offer----拡張:小球を投げる(京東)

1024 ワード

問題の説明:
東さんは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
       . . .