我需要帮助理解模运算符

时间:2017-01-17 23:38:10

标签: c# modulo

我试图在几年前用我的新语言C#重新创建我的C ++因子程序。我所记得的只是它可能涉及一个模数,而且可能没有。我知道它涉及至少一个for和if语句。然而,当我开始尝试重新创建它时,我不断得到应有的东西。我认为它与我有关,不理解循环,但事实证明我理解循环就好了。我不明白的是在执行数学运算时如何使用模数。

例如,当我说出以下内容时,我正在做什么:

(忽略它可能实际上不起作用,这只是一个例子)

if(12 % 2  == 0)
 {
  Console.WriteLine("I don't understand.");
 }

这种事情我还没有掌握。我意识到这是剩余的,这是我能掌握的,而不是它在实际编程中的实际应用。经过一番思考和修补后,我设法让我的因子程序在C#中工作,这并不意味着我理解这个运算符或它的用途。我无法再访问旧的C ++文件。

5 个答案:

答案 0 :(得分:4)

%(modulo)运算符从除法中产生余数。在您的示例中,余数等于0, if 计算为 true (0 == 0)。一个典型的例子就是它用于查看数字是否均匀。

if (number % 2 == 0) {
   // even
} else {
   // odd
}

答案 1 :(得分:3)

将模数视为带指针(旋转器)的圆形,最简单的例子是时钟。

https://latex.artofproblemsolving.com/f/4/d/f4daa2601de14fddf3d8441e16cc322a25e85354.png

注意顶部是零。

模数函数将任何值映射到微调器上的其中一个值,将%左侧的值视为微调器周围的步数,第二个值作为总数的值旋转器中的步骤,所以我们有以下内容。

0%12 = 0

1%12 = 1

12%12 = 0

13%12 = 1

我们总是从0开始。

所以如果我们绕着12步旋转器走0步,我们仍然是0,如果我们从0开始走1步,我们在1,如果我们走12步,我们回到0.如果我们走13,我们全部去一路走来又一结束了。

我希望这有助于您将其可视化。

当您使用类似数组的结构时,它会有所帮助,并且您希望循环使用它们。想象一下,你有一个星期几的数组,7个元素(星期一)。您希望始终显示当天的第3天。好今天是星期二,所以数组元素是days[1],如果我们想要从现在起3天后我们做days[1+3];现在这没关系,但是如果我们在星期六那么{{1}并希望从那里获得3天?好吧,我们有(days[5])这是一个超出范围的索引错误,因为我们的数组只有7个元素(最大索引为6),我们试图访问第8个元素。

但是,了解您对模数和微调器的了解,现在可以执行以下操作:

days[5+3]当它越过数组的边界时,它会回绕并再次从头开始。这有很多应用。只要记住旋转器的可视化,就在它点击我的脑袋时。

答案 2 :(得分:1)

模运算符%返回除法运算的余数。例如,13 / 5 = 213 % 5 = 3(使用整数数学)。

检查% 2的值以查看它是否为偶数是一种常见的策略。如果是偶数,则余数为0,否则为1。

至于你具体使用它,你正在做12 % 2,它不仅是0,而且总是为0.这将始终使if条件成为12 % 2 == 0是的,这使得if更加冗余。

答案 3 :(得分:1)

如上所述,它常用于检查偶数/奇数,但也可以用它来间隔迭代循环,或将文件拆分成mod块。我个人使用mod来解决钟面类型问题,因为我的数据经常导航一圈。

寄存器是mod,例如8位寄存器在2 ^ 8处翻转,因此可以强制符合寄存器大小var = mod(var,256)

我对mod知道的最后一件事是它用于校验和和随机数生成,但我还没有进入原因。在所有

答案 4 :(得分:-1)

您可以使用此示例的示例是在某些for循环中索引数组。例如,使用简单的公式,使用双三次插值定义重采样图像的新像素值:

其中

暂时不要担心双三次插值究竟是什么,我们只关心执行似乎是两个简单的for循环:一个用于索引i而一个用于索引{{ 1}}。请注意,向量'a'的长度为16个数字。

有人尝试的简单j循环可能是:

for

或者您可以在一个int n= 0; for(int i = 0; i < 4; ++i) { for(int j = 0; i < 4; ++j) { pxy += a[n] * pow(x,i) * pow(y,j); // p(x,y) n++; // n = 15 when finished } } 循环中执行此操作:

for

在循环中打印for(int i = 0; i < 16; ++i) { int i_new = floor(i / 4.0); // i_new provides indices 0-3 incrementing every 4 iterations of loop int j_new = i % 4; // j_new is reset to 0 when i is a multiple of 4 pxy += a[i] * pow(x,i_new) * pow(y,j_new); // p(x,y) } i_new

j_new

如您所见,i_new j_new 0 0 0 1 0 2 0 3 1 0 1 1 1 2 1 3 2 0 2 1 2 2 2 3 3 0 3 1 3 2 3 3 非常有用。