%(mod)解释

Wol*_*lfy 33 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
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*nan 15

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

你问:

如何在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;
}
Run Code Online (Sandbox Code Playgroud)

  • 您的代码提供的结果不正确,例如mod(-5,5)== 5.有关工作示例,请参阅[answer](http://stackoverflow.com/questions/1082917/mod-of-negative-number-是融我的脑) (8认同)

Nie*_*sol 7

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

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

int mod(int a, int n) {
    return ((a%n)+n) % n;
}
Run Code Online (Sandbox Code Playgroud)


Skl*_*vvz 5

模运算,一个定义基于模数.换句话说,在模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;
Run Code Online (Sandbox Code Playgroud)

测试实施:

单声道/ 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
Run Code Online (Sandbox Code Playgroud)

Python:

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

machine:~ user$ python mod.py
3
0
-2
Run Code Online (Sandbox Code Playgroud)