C# %(mod)解释

C# %(mod)解释,c#,math,operators,modulo,C#,Math,Operators,Modulo,今天我在用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

今天我在用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
int mod(int a, int n) {
    return ((a%n)+n) % n;
}
在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;
}
intmod(inta,intn)
{
int结果=a%n;

如果((result0)| |(result>0&&n两个答案都是正确的。尽管我个人认为“总是积极的”答案更有意义

您可以定义自己的模函数,该函数只能给出如下肯定答案:

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
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,余数是什么?”

-


获取标准模数的快速代码段:


测试实施:

Mono/C#

Python


在C-派生语言中,%不是模运算符。它是余数运算符。@RaymondChen看起来像是一个答案,而不是一个注释。但是,如果你愿意,我可以对它进行投票。我如何在C#中使用模运算符?Wolfy-如果值为负,只需加5。@Wolfy
C=a%b;如果(C<0){C+=b;
返回C;
什么是
mod 5,2)
return?该死的……好吧,让我再试一次。
mod(-2,-5)
returns-2。你说它应该总是返回正值,但有一些输入会导致它返回负值。这可以接受吗?这是预期的吗?我发现这样写更有效:
int c=a%b;if(c<0){c+=b;}返回c;
,但请注意,它并不表示为负divisors@EricLippert理论上,它应该返回0和第二个参数之间的值(如果除数是负数,那么它应该是负数,当除数是正数时它应该是正数,而不管股息的符号是什么),但是负数除数是非常少见的“标准模”为-2和-5?您的程序给出了-2,但我认为您打算给出非负结果。是否重试?@EricLippert它没有。它分别返回3和0。请参阅我的编辑。我向您保证,您的代码片段说-2和-5的标准模为-2。请尝试:
class P{static void Main(){intn=-2,m=-5;System.Console.WriteLine(((n%m)+m)%m));}
运行该命令,您将得到-2输出。如果您的意图是正则模为非负,那么您就没有达到您的意图。是否重试?@Eric啊,明白了!-5是模而不是另一个输入…好的,这仍然与python一致,尽管:
python-c'print-2%-5;'
返回
-2
.T我想这正是OP所期望的。对于一个正确处理负除数的版本,请看这个答案。这可能是相当罕见的,尽管如此,对于大多数用例,上面的答案都很好。您的代码给出了错误的结果,例如mod(-5,5)我修好了程序错误的代码,在这个例子中,看到这个“DRAKE”DaviHeffeNeNi我修正了这个答案的代码中的错误。问题是它应该检查<代码>结果<代码>的值,而不是<代码> A<代码>的值。
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
machine:~ user$ cat mod.py
print -2%5;
print -5%5;
print -2%-5;

machine:~ user$ python mod.py
3
0
-2