むかしむかし、王子の命を救った賢い召使いがいました。 王様は、召使いが望むものなら何でも報酬として与えると約束しました。 王様がチェスを愛していることを知っていた召使いは、小麦の粒がほしいと王様に伝えました。 チェス盤の最初のマスに1粒、次のマスからはマスが進むごとに粒の数が2倍になるように、と。
チェス盤の上にある小麦の粒の数を計算しましょう。
チェス盤には64のマスがあります。 1マス目には1粒、2マス目には2粒、3マス目には4粒、というように、マスが進むごとに2倍になっていきます。
次のものを計算するコードを書きましょう。
PHPのドキュメントによると、整数には最大値があります。
intのサイズはプラットフォームに依存しますが、通常は最大値が約20億です(これは32ビットの符号付きです)。 64ビットのプラットフォームでは、通常、最大値は約9E18です。 PHPは符号なしのintをサポートしていません。
言い換えると、PHPは2^63以上の数を整数として表すことができません。
この演習のテストの一部では、64ビット整数(2^64)が必要ですが、これはPHPの整数サイズの上限を超えています。
数値が大きくなりすぎると、PHPはintを自動的にfloatに変換します。
PHPが
int型の範囲を超える数値に遭遇すると、それは代わりにfloatとして解釈されます。 また、int型の範囲を超える数値になる演算も、代わりにfloatを返します。
しかし、float型は精度が限られています。
そしてKingは精度の低さを嫌っています。
そこでKingは、答えをintやfloatで表すのではなく、整数値を表す文字列として計算結果を期待することにしました。
しかも、最後に手を抜いて変換するだけではなく、整数の計算を求めています。
言語が直接扱える範囲を超える数値を使わずに、これを解くことはできますか? また、gmpやbcのような他のPHPライブラリも使わないでください。