競プロ純粋培養PHPerのみなさんへ

前回までのあらすじ

PHPAtCoderに参加する人が増えてきてうれしい一般通過純粋培養PHPerであるところの私のこのブログが、AtCoder Clansさんに補足されたことで閲覧者が増えているので、せっかくなら役に立ちそうな記事を増やしておこうと思ったりしました。

純粋培養PHPerにありがちなこと

業務でPHPを使っているわけでもなくPHPを選んだ人のことを純粋培養PHPerと呼んでいますが、「型」を意識していない操作をしがちな気がします。

本題

問題となりそうなのは、だいたいfloorとceilですね。(ホンマか?)

AtCoderのコードテストでPHPを選んで、ソースコード「<?php echo PHP_INT_MAX;」で実行すると「9223372036854775807」と出力されます。たぶん2^63-1くらいですね。

では、「<?php echo floor(100000000000000/1);」とするとどうでしょうか?

これの出力は「1.0E+14」です。(詳しくは、PHP: 浮動小数点数 - Manual を参照)

要するに、「型を指定しなかったので、勝手に適切な型を選んでくれた結果、INTではなくなりました」ということですね。

解決策としては、「INTになるように計算しましょう」という話です。(この記事を書くために調べて知ったのですが、そもそも「/」が「浮動小数点数の除算」をしていて、「割る数と割られる数と答えが整数の場合のみ勝手に整数にして返す」という仕組みらしいです。詳しくは、PHP: 代数演算子 - Manual を参照)

(これ、もしかすると「要するに、~」のところが間違ってたりしませんか?まあ私も純粋培養勢なので、詳しいことは本職の方が教えてくれるでしょう。)

おわりに

型の指定をしなくてもいい感じにやってくれるのが、純粋培養PHPerにとって諸刃の剣であることを理解したうえで、謙虚に頑張りましょう。

あと、AtCoderでは任意精度数学関数(BC Math関数)なるものや、GMP関数なるものも使えるので、暇なときに調べてみると良いかもしれません。