負数の割り算と剰余の違い

Pythonの // は負の無限大への切り下げ。C++の整数除算は0方向への切り捨てです。負数を扱う移植で結果が変わります。

言語:C++ / 計算量:例の処理による

前提:整数型とオーバーフロー

考え方

  1. Python: -7//3=-3、-7%3=2。
  2. C++: -7/3=-2、-7%3=-1。
  3. 正の法 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";}

読了の記録・下書き・メモへ

関連する公式資料・課題