我在哪里可以找到一个计算整数欧几里得除法余数的实现或库,0 <= r < |n|
?
/
和%
运算符)可以是欧几里得除法也可以是非欧几里得除法 - 这是实现定义的。然而,大多数实现将商向零截断,这很不幸是非欧几里得除法。5 / -3 = -1
且5 % -3 = -2
。在欧几里得除法中,5 / -3 = -2
且5 % -3 = 1
。%
并校正负余数来轻松地自行实现欧几里得除法。int euclidean_remainder(int a, int b)
{
assert(b != 0);
int r = a % b;
return r >= 0 ? r : r + std::abs(b);
}
围绕此功能或其任何变体编写自己的函数,并不要因库而卡住——你花在询问上的时间比直接执行它还要长。为您需要的简单函数启动自己的库(工具箱)。
这是一个简单的运算符:%。
例如,5 % 4 的结果为1等等。
编辑: 正如已经指出的那样,根据你的实现,这不一定是欧几里德模。
#define EUCMOD(a, b) (a < 0 ? (((a % b) + b) % b) : (a % b))
fmod(3.3, 2.4)
的结果为 0.9
。 - chrisa%b
中的b
加到结果上,如果结果是负数。 - chris我真的很喜欢布兰登的答案,但我开始遇到一些奇怪的错误。
经过测试,我发现 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)))