在C语言中实现模运算符作为一个函数

20

如何在不使用操作符的情况下,在C中将模运算符实现为函数?

5个回答

41

进行整数除法,然后乘以一个数,最后减去结果。

#include <stdio.h>
int main()
{
  int c=8, m=3, result=c-(c/m*m);
  printf("%d\n", result);
}

9
在上述代码中,-21 mod 20 的结果为 -1,但实际应该是 19。这仅适用于正数。 - Rogue

19

这是您要的内容:

a % b = a - (b * int(a/b))

5
那个投射符号只在C++中有效(问题是关于C语言的),如果a和b是整数,则它是多余的。但是,负评来自其他地方。 - Jonathan Leffler
8
在C语言中,你需要写(int)(a/b)来实现整数除法。而使用类型函数表示法int(a/b)则是C++特有的写法。 - Jonathan Leffler
4
这对负数不起作用。-5模4应该为“3”,但是“-5 - ((int)(-5/4) * 4)”的输出为“-1”。 - Aaron Franke
@AaronFranke 这不是真的。在 C/C++ 中,fmod(-5,4)==fmodf(-5,4)==(-5%4)==-1。你说的是 ((a%b)+b)%b) - kritzikratzi
1
@AaronFranke 这个问题确实是关于 C 语言的 :) 无论如何,我今天学到了一些东西:我在谈论“截断”除法,而你在谈论“向下取整”除法。更多信息请参见此处,这是一个令人着迷且全面的概述:https://en.wikipedia.org/wiki/Modulo_operation#In_programming_languages - kritzikratzi
显示剩余2条评论

8

您可以通过反复从x中减去y并跟踪结果来模拟x % y。在每次迭代中,如果结果小于y,则您就有了余数,可以直接返回它。


3
如果电脑没有乘除功能,这种方法可能会很慢,但仍然有用。 - user674669
2
这不是真正的软件实现方式。真正的软件实现方式会将第二个操作数加倍,直到再次加倍使其大于第一个操作数,然后进行减法运算,接着开始将第二个操作数除以二并进行减法运算。 - user207421

3

简单来说:

如果商 a/b 可以表示,则表达式 (a/b)*b + a%b 应等于 a

(C99标准,6.5.5/6)。


29
这并没有直接回答问题,它只是对于百分号运算符的公理定义(因此并不是真正的“简单”)。我对这个回答得票数感到好奇。 - Clifford
7
也许是因为通过一个明显的转换(从两边减去(a/b)*b),它变成了一个确定a%b的公式? - caf
6
@caf: 或许是这样,但是更简单的方式是呈现“显而易见”的转换,而不是假设读者拥有(即使是基础的)数学技能。OP的数学能力未知,假设它显而易见可能只会显得炫耀。 - Clifford
3
"不使用运算符",即不使用%运算符,也就是说你的答案使用了取模运算符,因此你没有回答他的问题,事实上有点傲慢。" - MarcusJ
2
这不起作用。如果 a = 15 并且 b = 8,则会正确得到 7。如果 a = -15 并且 b = 8,则会得到 1。两个都应该是 7 - Hatefiend
浮点数呢?对于浮点数,(a/b)*b 总是等于 a - Aaron Franke

1

被除数 / 除数 = 商

以下是 Python 3 中的公式:

模数 = 被除数 - 被除数 // 除数 * 除数

例如,如果被除数为 5,除数为 2,则

模数 = 5 - 5 // 2 * 2,即          5 - 2 * 2          5 - 4             1 请记住,// 的优先级高于 -,因此首先计算 5 // 2。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接