ABC089 C問題「March」を解いていたときのこと。
https://beta.atcoder.jp/contests/abc089/tasks/abc089_c
再び
のときと同じような落とし穴にはまってしまった。
intの数とintの数の積がintの範囲を超える可能性があったので、その積を入れる予定の変数のみlong long intにした。
これは誤りである。
intの数とintの数の積は、いくら積を入れる予定の変数がlong long int型であったとしてもintの範囲を超えた部分はオーバーフローしてしまうからだ。
積がintの範囲を超える可能性のある乗算をするときは、乗算の前には確実にintの範囲に収まっていてもその数(つまりかける数/かけられる数)をlong long int型(など)にする必要がある。
int a=2147483640;//intの範囲内
int b=2147483642;//intの範囲内
//a*bはintを超える
cout<<a*b<<endl;//これはダメ
long long int seki=a*b;
cout<<seki<<endl;//これもダメ
long long int a=2147483640;//intの範囲内
long long int b=2147483642;//intの範囲内
//a*bはintを超える
cout<<a*b<<endl;//OK
long long int seki=a*b;
cout<<seki<<endl;//もちろんOK
関係ないが、テストがヤバい(^^)/