今天我用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)
两个答案都是正确的.虽然我个人认为"总是积极的"更有意义.
您可以定义自己的模数函数,只给出这样的正答案:
int mod(int a, int n) {
return ((a%n)+n) % n;
}
Run Code Online (Sandbox Code Playgroud)
在模运算,一个定义类基于模数.换句话说,在模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,其余的将是什么?"
获得规范模数的快速代码段:
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)
| 归档时间: |
|
| 查看次数: |
62628 次 |
| 最近记录: |