負数の割り算と剰余の違い
Pythonの // は負の無限大への切り下げ。C++の整数除算は0方向への切り捨てです。負数を扱う移植で結果が変わります。
言語:C++ / 計算量:例の処理による
前提:整数型とオーバーフロー
考え方
- Python: -7//3=-3、-7%3=2。
- C++: -7/3=-2、-7%3=-1。
- 正の法 m で非負の余りに直すなら (x%m+m)%m。
具体例
周期の座標を0..m-1へ戻す問題で、C++の負の剰余をそのまま添字にすると危険です。
実装
#include <iostream>
using namespace std;
int main(){long long x=-7,m=3;cout<<x/m<<" "<<x%m<<"\n";cout<<(x%m+m)%m<<"\n";}注意する条件
(x+m)%m では x<-m の場合に負のままです。必要な値域と型の上限も確認します。
確認問題
C++で -7 / 3 の整数演算の結果は?
解答と理由
-2
0に近い方向へ切り捨てるため-2です。
実装課題
整数 X と正整数 M が1行。X と合同な0..M-1の整数を出す。|X|≤10^18、M≤10^9。
入力:
-7 3
出力:
2参考実装
#include <iostream>
using namespace std;
int main(){long long x,m;cin>>x>>m;cout<<(x%m+m)%m<<"\n";}