穀物

穀物

中級

はじめに

むかしむかし、王子の命を救った賢い召使いがいました。 王様は、召使いが望むものなら何でも報酬として与えると約束しました。 王様がチェスを愛していることを知っていた召使いは、小麦の粒がほしいと王様に伝えました。 チェス盤の最初のマスに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ライブラリも使わないでください。

GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
PHP Exercism

穀物を始める準備はできましたか?

Exercismに登録すれば、11個のコンセプト122個の演習、そして本物の人間によるメンタリングとともに、PHPを学んでマスターできます。すべて無料です。