识别何时使用模数运算符

Cod*_*bug 56 operators modulo

我知道模数(%)运算符计算除法的余数.如何确定需要使用模数运算符的情况?

我知道我可以使用模数运算符来查看数字是偶数还是奇数和素数或复合数,但这就是它.我不经常考虑剩余的问题.我确定模数运算符很有用,我想学习利用它.

我只是在识别模数运算符适用的位置时遇到问题.在各种编程环境中,我很难看到问题并意识到"嘿!其余的部门会在这里工作!".

Pau*_*l R 25

想象一下,您有一个以秒为单位的经过时间,并且您希望将其转换为小时,分钟和秒:

h = s / 3600;
m = (s / 60) % 60;
s = s % 60;
Run Code Online (Sandbox Code Playgroud)


Sys*_*min 20

0 % 3 = 0;
1 % 3 = 1;
2 % 3 = 2;
3 % 3 = 0;
Run Code Online (Sandbox Code Playgroud)

你看到它做了什么?在最后一步,它回到了零.这可以用于以下情况:

  1. 检查N是否可被M整除(例如,奇数或偶数)或N是M的倍数.

  2. 设置特定值的上限.在这种情况下3.

  3. 获取数字的最后M位数 - > N%(10 ^ M).


Sea*_*ive 16

我用它来表示通过大循环标记进度的进度条等.仅在循环中每隔n次报告进度,或者当计数%n == 0时报告进度.

  • 确实如此.对于更快的版本,我喜欢使用位逻辑:`count&0xff == 0`(你可以使用0xf或0xff或0xfff等:这个点的二进制数是一个1s的实心字符串) (2认同)

Bob*_*Bob 11

我在将数字限制到某个倍数时使用过它:

temp = x - (x % 10); //Restrict x to being a multiple of 10
Run Code Online (Sandbox Code Playgroud)

  • 你能给出这个的实际用法吗? (2认同)

jwe*_*ich 10

  • 包装值(如时钟).
  • 为对称密钥算法提供有限域.
  • 按位运算.

等等.


And*_*rey 5

例子。您有 X 字节的消息,但在您的协议中,最大大小为 Y 且 Y < X。尝试编写将消息拆分为数据包的小应用程序,您将遇到 mod :)


Jus*_*ier 5

在很多情况下它都是有用的。

如果需要将数字限制在某个范围内,可以使用 mod。例如,要生成 0 到 99 之间的随机数,您可能会说:

num = MyRandFunction() % 100;
Run Code Online (Sandbox Code Playgroud)

  • -1。这将生成不均匀的结果,除非 100 是 `MyRandFunction()` 范围的除数。(假设您想要一个“0 .. RAND_MAX*2/3”中的随机数。) (6认同)

Mat*_*att 5

每当您进行除法并想要以十进制以外的方式表示余数时,mod 运算符都是合适的。通常想到的事情是当你想用剩余的部分做一些人类可读的事情时。列出您可以放入桶中的物品数量并说“剩余 5 件”是很好的做法。

另外,如果您遇到可能会产生舍入误差的情况,那么模除法是很好的选择。例如,如果您经常除以 3,则您不希望将 0.33333 作为余数传递。传递余数和除数(即分数)是合适的。


Car*_*ter 5

正如@jweyrich 所说,包装价值观。当我有一个有限的列表并且我想在循环中迭代它时,我发现 mod 非常方便 - 就像某些 UI 元素的固定颜色列表,例如图表系列,我希望所有系列都不同,尽可能地,但是当我用完颜色时,就从头开始。这也可以与图案一起使用,这样当红色第二次出现时,它就会变成虚线;第三次,点状等 - 但 mod 只是用来获得红色,绿色,蓝色,红色,绿色,蓝色,永远。


JCM*_*JCM 5

我最近看到的一个用例是当您需要反转一个数字时。所以123456这就变成654321了例如。

int number   = 123456;
int reversed = 0;

while ( number > 0 ) {
    # The modulus here retrieves the last digit in the specified number
    # In the first iteration of this loop it's going to be 6, then 5, ...
    # We are multiplying reversed by 10 first, to move the number one decimal place to the left.
    # For example, if we are at the second iteration of this loop, 
    #  reversed gonna be 6, so 6 * 10 + 12345 % 10 => 60 + 5
    reversed = reversed * 10 + number % 10;
    number = number / 10;
}
Run Code Online (Sandbox Code Playgroud)