競技プログラミングを想定して書いていますが、他でもハマる可能性はあるかもしれません。
Rustのデフォルト整数型
Rustのデフォルトの整数型はi32
になっているようです。
integer types default to i32
以下のコードで試してみることもできます。
(print_typename
については https://qiita.com/garkimasera/items/729dbf11dd5738c70e11 を参考にしました)
fn main() {
let m = 0usize;
print_typename(m);
let n = 0;
print_typename(n);
}
fn print_typename<T>(_: T) {
println!("{}", std::any::type_name::<T>());
}
出力:
usize
i32
競プロの場合
32ビットの上限は、符号なしの場合で4 * 10^9程度なので、競プロで扱う数の大きさだと容易にあふれます。
さらにcargo run
デバッグビルドしている場合はオーバーフローをチェックしてくれますが、リリースビルドではチェックしてくれません。
そのため以下のコードはcargo run --release
で実行すると-2147483648
を出力し、終了ステータスも0(正常終了)となります。
fn main() {
let l = std::i32::MAX;
println!("{}", l + 1);
}
AtCoder上の表示もREではなくWAとなります。気をつけましょう。
結論
できるだけ、変数に型アノテーションをつけるか0usize
などとしましょう。