在 C++ 中使用模数运算符

Jinku Hu 2023年10月12日
  1. 使用%运算符计算除法中的余数
  2. 使用%运算符在 C++ 中生成小于给定最大数的随机整数
  3. 在 C++ 中使用库定义的函数对象来替换%运算符
在 C++ 中使用模数运算符

本文将介绍如何在 C++ 中使用模数运算符。

使用%运算符计算除法中的余数

模 (%)运算符的标准功能是计算除法的余数。语句的返回值-x % y 代表 x 除以 y 后剩下的余数。模数运算符的定义是两个操作数必须是整数,并且除数是非零。下面的例子演示了模数运算符在不同的有符号整数对中的应用。请注意,如果要使用 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 函数,其返回值与所需的最大值使用 modulo 运算符配对。

#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
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook