C++ でモジュロ演算子を使用する
    
    胡金庫
    2023年10月12日
    
    C++
    C++ Modulo
    
 
この記事では、C++ でのモジュロ演算子の使い方を紹介します。
演算子 % を使って除算で残量を計算する
    
モジュロ (%)演算子の標準的な機能は、除算の残りを計算することです。文の戻り値 - x % y は x を y で割った後に残った残りを表します。モデューロ演算子は、両方のオペランドが整数でなければならず、除数は 0 以外の値でなければならないように定義されています。次の例は、異なる符号付き整数のペアでモジュロ演算子を示しています。なお、printf 関数を使って % という文字をコンソールに表示するには、%% を使用する必要があります。
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
int main() {
  vector<int> ivec1{24, 24, -24, -24, 24};
  vector<int> ivec2{7, 8, -8, -7, -6};
  for (size_t i = 0; i < ivec1.size(); ++i) {
    printf("% -d %% % -d = % -d\n", ivec1[i], ivec2[i], ivec1[i] % ivec2[i]);
  }
  cout << endl;
  return EXIT_SUCCESS;
}
出力:
 24 %  7 =  3
 24 %  8 =  0
-24 % -8 =  0
-24 % -7 = -3
 24 % -6 =  0
C++ で与えられた最大数以下の乱数を生成するために % 演算子を使用する
モジュロ演算子の代替的な使用法は、特定の整数以下の数値のみを提供するように乱数生成器を制御することです。プログラマはランダム性の質の必要性に応じて乱数生成ツールキットを選択する責任があるが、どちらの方法も生成される数値の上限を指定するために % と組み合わせることができます。この場合、rand 関数を用います。この戻り値は、モジュロ演算子を用いて希望する最大値と対になります。
#include <ctime>
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
constexpr int MAX = 1000;
constexpr int NUMS_TO_GENERATE = 10;
int main() {
  vector<int> ivec1{24, 24, -24, -24, 24};
  vector<int> ivec2{7, 8, -8, -7, -6};
  std::srand(std::time(nullptr));
  for (int i = 0; i < NUMS_TO_GENERATE; i++) {
    cout << rand() % MAX << "; ";
  }
  cout << endl;
  cout << endl;
  return EXIT_SUCCESS;
}
出力:
98; 194; 398; 190; 782; 550; 404; 557; 509; 945;
ライブラリ定義関数オブジェクトを使用して C++ の % 演算子を置き換える
C++ 標準ライブラリでは、伝統的な算術演算子、関係演算子、論理演算子を表す複数のクラスが定義されています。これらは関数オブジェクトと呼ばれ、std::plus<Type>、std::modulus<Type> などの名前が付けられています。Type は呼び出し演算子のパラメータの型を指定します。以下のコードサンプルは、std::modulus 関数オブジェクトを整数のベクトルに利用したものです。
#include <ctime>
#include <iostream>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
int main() {
  vector<int> ivec1{24, 24, -24, -24, 24};
  vector<int> ivec2{7, 8, -8, -7, -6};
  std::modulus<> intMod;
  int mod_of_nums = intMod(ivec1[1], ivec2[1]);
  printf("%d %% %d = %d\n", ivec1[1], ivec2[1], mod_of_nums);
  return EXIT_SUCCESS;
}
出力:
24 % 8 = 0
        チュートリアルを楽しんでいますか? <a href="https://www.youtube.com/@delftstack/?sub_confirmation=1" style="color: #a94442; font-weight: bold; text-decoration: underline;">DelftStackをチャンネル登録</a> して、高品質な動画ガイドをさらに制作するためのサポートをお願いします。 Subscribe
    
著者: 胡金庫
    
