%(mod)解释

时间:2012-04-08 18:04:28

标签: c# math

今天我用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

我做错了什么或%不能正常工作吗?

4 个答案:

答案 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)