最近、仕事と関連していて頭を使う新たな趣味を始めようと思い、週末などに競技プログラミング (AtCoder) の過去問を黙々と解いている。言語は、速度やライブラリの充実度を考えると C++ が良さそうだったのだが、仕事で一番馴染んでいるのがJavaだったので、今はJavaで問題を解いている。
問題を解いていく中で、C~D問題以降では、変数の型に何も考えずに int 型を使っていると、桁あふれが起きて値が不正になってしまうことがある。また、int 型での桁あふれを見越して long 型を使っても、問題によっては桁あふれが起きてしまうことがあった。
そこで、今後問題を解く時に変数の型を何にするのかの目安として、int 型と long 型の最大値と、そのオーダー (10の何乗) をメモっておく。
- int max
10^9 < 2,147,483,647 < 10^10
- long max
10^18 < 9,223,372,036,854,775,807 < 10^19
なお、long max を超える整数を扱う場合、BigInteger 型を使うことになる。double 型でも扱える気がするかもしれないが、大きな整数を double 型で扱うと精度が落ちて計算結果が不正になることがあるので、(プリミティブ型でなくて重いが・・)、BigInteger 型を使う。