2012-04-08 37 views
25

Hôm nay tôi đang viết một chương trình trong C#, và tôi sử dụng % để tính toán một số chỉ số ... Chương trình của tôi đã không làm việc, vì vậy tôi sửa lỗi nó và tôi nhận ra rằng "%" không hoạt động như các ngôn ngữ khác trong chương trình mà tôi biết.% (mod) giải thích

Ví dụ:

Trong Python % lợi nhuận giá trị như thế này:

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 

Trong 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ủa tôi làm điều gì đó sai hoặc được % không làm việc như nó nên?

+36

Trong ngôn ngữ C có nguồn gốc từ,% không phải là các nhà điều hành mô đun. Đó là toán tử * còn lại *. [Eric Lippert giải thích] (http://blogs.msdn.com/b/ericlippert/archive/2011/12/05/what-s-the-difference-remainder-vs-modulus.aspx). –

+8

@RaymondChen trông giống như một câu trả lời, không phải là nhận xét. Tôi có thể upvote nó nếu bạn muốn, mặc dù. –

+1

Làm thế nào tôi có thể sử dụng toán tử mô đun trong C#? – Wolfy

Trả lời

13

Như được giải thích trong các nhận xét, hành vi khác nhau là do thiết kế. Các ngôn ngữ khác nhau chỉ định nghĩa các ý nghĩa khác nhau đối với toán tử %.

Bạn hỏi:

Làm thế nào tôi có thể sử dụng toán tử mô đun trong C#?

Bạn có thể xác định một nhà điều hành mô đun chính mình mà cư xử như nhau ấy giống như sự điều hành Python %:

int mod(int a, int n) 
{ 
    int result = a % n; 
    if ((a<0 && n>0) || (a>0 && n<0)) 
     result += n; 
    return result; 
} 
+7

Mã của bạn cho kết quả không đúng, ví dụ mod (-5, 5) == 5. Ví dụ làm việc, xem [answer] này (http://stackoverflow.com/questions/1082917/mod-of-negative-number) -is-melting-my-brain) – Drake

5

Cả hai câu trả lời là chính xác. Mặc dù cá nhân tôi nghĩ rằng "luôn luôn tích cực" một trong những ý nghĩa hơn.

Bạn có thể xác định chức năng mô đun của riêng bạn mà chỉ cung cấp cho câu trả lời tích cực như thế này:

int mod(int a, int n) { 
    return ((a%n)+n) % n; 
} 
+1

những gì hiện 'mod (-5, 2)' trở lại? –

+0

Chết tiệt ... Được rồi, để tôi thử lại. –

+1

'mod (-2, -5)' trả về -2. Bạn nói rằng nó phải trả về giá trị luôn luôn tích cực, nhưng có những yếu tố đầu vào làm cho nó trả về giá trị âm. điều này có chấp nhận được không? Nó được mong đợi? –

4

Trong modular arithmetic, một định nghĩa lớp số dựa trên modulo. Nói cách khác, trong modulo m số học, một số n là tương đương (đọc: giống nhau) để n + m, n-m, n + 2m, n-2m vv

một định nghĩa m "giỏ" và mỗi số rơi vào một (và chỉ một) trong số họ.

Ví dụ: người ta có thể nói "Đó là 4:30" hay người ta có thể nói "Đó là 16:30". Cả hai hình thức có nghĩa là chính xác cùng một lúc, nhưng khác nhau là đại diện của nó.

Do đó cả hai kết quả Python và C# đều chính xác!Các số này là cùng một số trong modulo số học bạn đã chọn. Nó cũng sẽ là toán học đúng để trả về (5, 6, 7, 8, 9) chẳng hạn. Chỉ là một chút kỳ quặc.

Đối với việc lựa chọn đại diện (nói cách khác, lựa chọn cách biểu diễn số âm), đó chỉ là trường hợp lựa chọn thiết kế khác nhau giữa hai ngôn ngữ.

Tuy nhiên, đó không phải là điều mà toán tử% thực sự thực hiện trong C#. Toán tử% không phải là toán tử mô đun kinh điển; nó là toán tử còn lại. Toán tử A% B thực sự trả lời câu hỏi "Nếu tôi chia A cho B bằng số học số nguyên, số còn lại sẽ là bao nhiêu?"

What's the difference? Remainder vs Modulus by Eric Lippert


đoạn nhanh để có được những mô đun kinh điển:

return ((n % m) + m) % m; 

Kiểm tra thực hiện:

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 
+1

"Mô đun kinh điển" của -2 và -5 là gì? Chương trình của bạn cho -2, nhưng tôi nghĩ bạn đã có ý định đưa ra kết quả không tiêu cực. Hãy cẩn thận để thử lại? –

+0

@EricLippert Nó không. Nó trả về 3 và 0, tương ứng. Xem chỉnh sửa của tôi. – Sklivvz

+1

Tôi đảm bảo với bạn, đoạn mã của bạn nói rằng mô đun kinh điển của -2 và -5 là -2. Hãy thử nó: 'class P {static void Main() {int n = -2, m = -5; System.Console.WriteLine (((n% m) + m)% m)); }} 'Chạy đó, bạn sẽ nhận được -2 in ra. Nếu đó là ý định của bạn rằng mô-đun kinh điển là không tiêu cực, bạn đã thất bại trong việc đạt được ý định của mình. Hãy cẩn thận để thử lại? –