在C中实现模运算符作为函数

Ykt*_*ula 14 c operators modulo

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

Ign*_*ams 37

进行整数除法后跟乘法,然后减去.

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

  • 上面代码中的`-21` mod `20` == `-1`,但它应该是`19`。仅适用于积极的一面 (4认同)

fbr*_*eto 10

干得好:

a % b = a - (b * int(a/b))
Run Code Online (Sandbox Code Playgroud)

  • @ user674669:在C中你必须写`(int)(a/b)`.类型函数符号`int(a/b)`特定于C++. (4认同)
  • 这不适用于负数。-5 modulo 4 应该是 `3`,但是 `-5 - ((int)(-5/4) * 4)` 输出 `-1`。 (4认同)
  • 该演绎符号仅适用于C++(而不是C,问题所在),如果a和b是整数,那么它是多余的.但是downvote来自其他地方. (3认同)

Jus*_*ier 6

你可以模拟x % y通过反复减去yx和跟踪结果。在每次迭代中,如果结果小于y,则您有余数,可以将其返回。

  • 如果计算机没有乘法/除法功能,这可能很慢,但很有用。 (2认同)
  • 这不是真正的软件实现的工作方式。真正的软件实现会将第二个操作数加倍,直到再次加倍使其大于第一个,减去,然后开始将第二个操作数除以二并减去。 (2认同)

Jam*_*lis 5

简单:

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

(C99标准,6.5.5/6).

  • 这并没有直接回答这个问题,它只是%运算符的公理定义(因此并非真正"简单").我想知道这个选票的数量. (19认同)
  • @Clifford:也许是因为有明显的转换(从两边减去`(a/b)*b`​​)它成为确定'a%b`的公式? (5认同)
  • @caf:也许,但"简单"本来就是呈现"明显的"转变而不是假设读者拥有(尽管是基本的)数学技能.OP的数学能力未知; 假设很明显可能只是炫耀一下. (5认同)
  • "不使用运算符"aka,不要使用%运算符,也就是你的答案使用模运算符,因此你没有回答他的问题,事实上它有点自鸣得意...... (3认同)
  • @OskarBerggren:那么4年过去了,他可能已经毕业了 - 你有点晚了!;) (2认同)
  • 这不起作用。如果 `a = 15` 和 `b = 8`,你会得到正确的 `7`。如果`a = -15` 和`b = 8` 你将得到`1`。两者都应该是`7` (2认同)