In modular arithmetic, si definisce classi di numeri sulla base del modulo. In altre parole, nel modulo m aritmetiche, un numero n è equivalente (leggi: la stessa) a n + m, n - m, n + 2m, n - 2m, ecc
soltanto definisce m "panieri" e ogni numero cade in uno (e uno solo) di loro.
Esempio: si può dire "E '16:30" oppure si può dire "E' 16:30". Entrambe le forme significano esattamente lo stesso tempo, ma sono diverse rappresentazioni di esso.
Quindi entrambi i risultati di Python e C# sono corretti!I numeri sono lo stesso nel modulo aritmetica che hai scelto. Sarebbe anche stato matematicamente corretto per restituire (5, 6, 7, 8, 9) per esempio. Solo un po 'strano.
Per quanto riguarda la scelta della rappresentazione (in altre parole, la scelta su come rappresentare i numeri negativi), questo è solo un caso di scelte progettuali diverse tra le due lingue.
Tuttavia, ciò non è affatto ciò che l'operatore% in realtà fa in C#. L'operatore% non è l'operatore del modulo canonico; è il resto dell'operatore. L'operatore A% B risponde effettivamente alla domanda "Se dividessi A per B usando l'aritmetica dei numeri interi, quale sarebbe il resto?"
— What's the difference? Remainder vs Modulus by Eric Lippert
frammento veloce per ottenere il modulo canonica:
return ((n % m) + m) % m;
implementazione di prova:
Mono/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
In linguaggi C-derivati,% non è l'operatore modulo. È l'operatore * resto *. [Eric Lippert spiega] (http://blogs.msdn.com/b/ericlippert/archive/2011/12/05/what-s-the-difference-remainder-vs-modulus.aspx). –
@RaymondChen che sembra una risposta, non un commento. Posso prevederlo, se vuoi, però. –
Come posso utilizzare l'operatore modulo in C#? – Wolfy