C++中的欧几里得整数模

Euclidean integer modulo in C++

本文关键字:几里 整数 C++      更新时间:2023-10-16

在哪里可以找到计算整数欧几里得除法余数0 <= r < |n|的实现或库?

在C++语言的C++98和C++03版本中,内置除法(位/%运算符)可能是欧几里得的,也可能是非欧几里得的——这是实现定义的。然而,大多数实现将商截断为零,不幸的是,这是非欧几里得

在大多数实现中,CCD_ 4和CCD_。在欧几里得除法中CCD_ 6和CCD_。

C++11要求整数除法是非欧几里得的:它需要一个向零截断的实现。

正如你所看到的,这个问题只是由负数引起的。因此,您可以通过使用运算符%和后校正负余数来轻松地实现欧几里得除法

int euclidean_remainder(int a, int b)
{
  assert(b != 0);
  int r = a % b;
  return r >= 0 ? r : r + std::abs(b);
}

如果结果必须为正,请尝试(x%m + m)%m

围绕这一点或任何变体编写你自己的函数,不要被库所困扰——你花了更多的时间询问,而不是仅仅去做。为你需要的简单函数创建你自己的库(工具箱)。

这是一个简单的运算符。%。

5%4是1等

编辑:正如已经指出的,根据您的实现,这不一定是欧几里德模型。

#define EUCMOD(a, b)  (a < 0 ? (((a % b) + b) % b) : (a % b))

我真的很喜欢Brandon的回答,但我开始有一些奇怪的错误。经过一些测试,我发现EUCMOD宏的扩展扰乱了操作的优先级。

因此,我建议将其用作函数,而不是宏

int eucmod(const int a, const int b)
{
    return (a < 0 ? (((a % b) + b) % b) : (a % b));
}

或者添加几个括号

#define EUCMOD(a,b) ((a) < 0 ? ((((a) % (b)) + (b)) % (b)) : ((a) % (b)))