とけろぐ

intどうしの積はどうあがいてもint

はじめに

ABC089 C問題「March」を解いていたときのこと。

https://beta.atcoder.jp/contests/abc089/tasks/abc089_c

再び

C/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

関係ないが、テストがヤバい(^^)/