%(mod)解释

今天我用C#编写了一个程序,我用来计算一些索引…我的程序没有用,所以我调试了它,我意识到“ ”不像我知道的其他程序语言那样工作。

例如:

在Python中, %返回如下值:

 for x in xrange (-5, 6): print x, "% 5 =", x % 5 -5 % 5 = 0 -4 % 5 = 1 -3 % 5 = 2 -2 % 5 = 3 -1 % 5 = 4 0 % 5 = 0 1 % 5 = 1 2 % 5 = 2 3 % 5 = 3 4 % 5 = 4 5 % 5 = 0 

在C#中:

 for (int i = -5; i < 6; i++) { Console.WriteLine(i + " % 5 = " + i % 5); } -5 % 5 = 0 -4 % 5 = -4 -3 % 5 = -3 -2 % 5 = -2 -1 % 5 = -1 0 % 5 = 0 1 % 5 = 1 2 % 5 = 2 3 % 5 = 3 4 % 5 = 4 5 % 5 = 0 

我做错了什么或者是不是应该像它那样工作?

正如评论中所解释的那样,不同的行为是设计的。 不同的语言只是赋予%运算符不同的含义。

你问:

如何在C#中使用模数运算符?

您可以自己定义一个模数运算符,其行为与Python %运算符相同:

 int mod(int a, int n) { int result = a % n; if ((result<0 && n>0) || (result>0 && n<0)) { result += n; } return result; } 

两个答案都是正确的。 虽然我个人认为“总是积极的”更有意义。

您可以定义自己的模数函数,只给出这样的正答案:

 int mod(int a, int n) { return ((a%n)+n) % n; } 

在模运算中 ,可以根据模数定义数字类。 换句话说,在模运算中,数n对于n + mnmn + 2mn2m等是等价的(读取:相同)。

一个定义m “篮子”,每个数字落在其中一个(并且只有一个)中。

例如 :可以说“下午4:30”或者可以说“这是16:30”。 两种forms的意思完全相同,但它们的表现forms不同。

因此,Python和C#结果都是正确的! 您选择的模5算法中的数字相同 。 例如,返回(5,6,7,8,9)在数学上也是正确的。 有点奇怪。

至于表示的选择(换句话说,选择如何表示负数),这只是两种语言之间不同设计选择的情况。

但是,这根本不是%运算符在C#中实际执行的操作。 %运算符不是规范模数运算符; 它是余数运算符。 A%B运算符实际上回答了问题“如果我使用整数运算将A除以B,其余的是什么?”

– 有什么区别? Eric Lippert的剩余与模数


获得规范模数的快速代码段:

 return ((n % m) + m) % m; 

测试实施:

单声道/ C#

 machine:~ user$ cat mod.cs using System; public class Program { public static void Main (string[] args) { Console.WriteLine(Mod(-2, 5)); Console.WriteLine(Mod(-5, 5)); Console.WriteLine(Mod(-2, -5)); } public static int Mod (int n, int m) { return ((n % m) + m) % m; } } machine:~ user$ mono mod.exe 3 0 -2 

Python

 machine:~ user$ cat mod.py print -2%5; print -5%5; print -2%-5; machine:~ user$ python mod.py 3 0 -2 

检查右侧的表格: http : //en.wikipedia.org/wiki/Modulo_operation