今天我用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
我做错了什么或%
不能正常工作吗?
答案 0 :(得分:14)
正如评论中所解释的那样,不同的行为是设计的。不同的语言只是赋予%
运算符不同的含义。
你问:
如何在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;
}
答案 1 :(得分:6)
两个答案都是正确的。虽然我个人认为“总是积极的”更有意义。
您可以定义自己的模数函数,只给出这样的正答案:
int mod(int a, int n) {
return ((a%n)+n) % n;
}
答案 2 :(得分:5)
在modular arithmetic中,根据模数定义数字的类。换句话说,在模 m 算术中,数字 n 等同于(读取:相同)到 n + m , n - m , n + 2m , n - 2m 等
一个人定义 m “篮子”,每个数字都属于一个(且只有一个)。
示例:可以说“下午4:30”或者可以说“这是16:30”。两种形式的意思完全相同,但它们的表示是不同的。
因此,Python和C#结果都是正确的!您选择的模 5 算术中的数字相同。例如,返回(5,6,7,8,9)也可以数学正确。有点奇怪。
至于表示的选择(换句话说,选择如何表示负数),这只是两种语言之间不同设计选择的情况。
但是,这完全不是%运算符在C#中实际执行的操作。 %运算符不是规范模数运算符;它是余数运算符。 A%B运算符实际上回答了问题“如果我使用整数运算将A除以B,其余的将是什么?”
- What's the difference? Remainder vs Modulus by 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
答案 3 :(得分:1)