今天我正在用 C# 编写一个程序,我使用
%
来计算一些索引...我的程序不起作用,所以我调试了它,我意识到 %
不像其他程序语言那样工作我知道。
例如:
在 Python 中
%
返回如下值:
for x in range(-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;
}
在模算术中,人们根据模定义数字的类。换句话说,在模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,余数是多少?”的问题
—
有什么区别?余数与模数
作者: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