今日、私はC#でプログラムを書いていて、%を使用してインデックスを計算していました...私のプログラムは機能しなかったので、デバッグして、 "% = "は、私が知っている他のプログラム言語のようには機能しません。
例えば:
In 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
私は何か間違ったことをしたか、%
期待どおりに動作していませんか?
コメントで説明されているように、異なる動作は仕様によるものです。異なる言語は、異なる意味を%
演算子に帰するだけです。
あなたが尋ねる:
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;
}
モジュラー演算 では、モジュロに基づいてclassesのクラスを定義します。つまり、モジュロm算術では、数値nはn+m、n-m、n +2m、n-2mなど.
1つはmの「バスケット」を定義し、すべての数字はそのうちの1つ(1つだけ)に含まれます。
例:「午後4時30分」と言うか、「16時30分」と言うことができます。両方の形式は正確に同じ時間を意味しますが、異なる表現です。
したがって、両方ともPythonおよびC#の結果は正しい!数値はモジュロ5算術でと同じである数学的に、たとえば(5、6、7、8、9)を返すのも正しいでしょう。
表現の選択(言い換えれば、負の数を表現する方法の選択)に関しては、2つの言語間で異なる設計選択のケースにすぎません。
ただし、C#で%演算子が実際に行うことはまったくありません。 %演算子は、標準のモジュラス演算子ではありません。それは剰余演算子です。 A%B演算子は、「整数演算を使用してAをBで除算した場合、剰余はどうなりますか?」という質問に実際に答えます。
— 違いは何ですか?剰余vsモジュラス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
右側の表を確認してください: http://en.wikipedia.org/wiki/Modulo_operation