2010-08-28 62 views
10

thể trùng lặp:
Recognizing when to use the mod operatorSử dụng thực tế mô đun (%) trong lập trình là gì?

những ứng dụng thực tế của mô đun là gì? Tôi biết phân chia modulo là gì. Kịch bản đầu tiên xuất hiện trong đầu tôi là sử dụng nó để tìm số lẻ và số chẵn, và số học đồng hồ. Nhưng nơi nào khác tôi có thể sử dụng nó?

+6

Quá nhiều ứng dụng. Có lẽ đây nên là cộng đồng wiki. – kennytm

+5

Bạn sử dụng nó khi cần thiết. "Đồng hồ số học" bao gồm tất cả các công dụng, phải không? –

Trả lời

5

Để in một số dưới dạng chuỗi, bạn cần mô-đun để tìm giá trị của một chữ số.

string number_to_string(uint number) { 
    string result = ""; 
    while (number != 0) { 
    result = cast(char)((number % 10) + '0') ~ result; 
    //     ^^^^^^^^^^^ 
    number /= 10; 
    } 
    return result; 
} 
+0

+1 để sử dụng D. :) –

19

Cách sử dụng phổ biến nhất mà tôi tìm thấy là "gói tròn" chỉ mục mảng của bạn.

Ví dụ, nếu bạn chỉ muốn lướt qua một mảng nhiều lần, bạn có thể sử dụng:

int a[10]; 
for (int i = 0; true; i = (i + 1) % 10) 
{ 
    // ... use a[i] ... 
} 

Các modulo đảm bảo rằng i ở lại trong 0, 10) khoảng [.

+1

Tôi không thể nghĩ ra bất kỳ cách sử dụng hữu ích nào của một vòng lặp vô hạn như vậy, nhưng nó trông rất tuyệt. – 2ndkauboy

+0

@ Kau-Boy Một loạt các hình ảnh để chu kỳ thông qua trên một tiêu đề trang web có thể, nhưng sau đó nó ít tầm thường để nhà nước 'if (i> đếm (mảng)) i = 1;' để bắt đầu lại. Tuy nhiên, vòng lặp for sẽ đặt mã hiển thị yêu cầu vào trong một khối. – amcc

+0

Câu trả lời và cách sử dụng tuyệt vời. – fanbondi

3
  • Mật mã học. Điều đó một mình sẽ chiếm một tỷ lệ phần trăm khiêu dâm của modulus (tôi phóng đại, nhưng bạn nhận được điểm).

Hãy thử the Wikipedia page quá:

số học Modular được tham chiếu trong lý thuyết số, lý thuyết nhóm, lý thuyết vòng, lý thuyết knot, đại số trừu tượng, mật mã, khoa học máy tính, hóa học và nghệ thuật thị giác và âm nhạc.

Theo kinh nghiệm của tôi, mọi thuật toán nâng cao có thể sẽ chạm vào một trong các chủ đề trên.

5

Một lần sử dụng cho hoạt động mô đun là khi thực hiện hash table. Nó được sử dụng để chuyển đổi giá trị ra khỏi hàm băm thành một chỉ mục thành mảng. (Nếu kích thước bảng băm là một sức mạnh của hai, mô đun có thể được thực hiện với một mặt nạ bit, nhưng nó là vẫn là một hoạt động mô đun.)

+0

Bạn có thể tạo một ví dụ mã không? – eaglei22

2

Vâng, có nhiều quan điểm bạn có thể nhìn vào nó. Nếu bạn đang xem nó như là một phép toán thì nó chỉ là một phân chia modulo. Thậm chí chúng ta không cần điều này như bất cứ điều gì% làm, chúng ta cũng có thể đạt được bằng cách sử dụng phép trừ, nhưng mọi ngôn ngữ lập trình đều thực hiện nó theo cách rất tối ưu.

Và phân chia modulu không bị giới hạn trong việc tìm số lẻ và số chẵn hoặc số học đồng hồ. Có hàng trăm thuật toán cần hoạt động mô-đun này, ví dụ, thuật toán mã hóa, v.v. Vì vậy, nó là một phép toán tổng quát như +, -, *, /, v.v.

Ngoại trừ phối cảnh toán học, các ngôn ngữ khác nhau sử dụng biểu tượng để xác định cấu trúc dữ liệu tích hợp, như trong Perl %hash được sử dụng để cho thấy rằng người lập trình đã khai báo một băm. Vì vậy, tất cả thay đổi dựa trên thiết kế ngôn ngữ lập trình.

Vì vậy, vẫn có nhiều quan điểm khác mà người ta có thể thêm vào danh sách sử dụng%.

3

Việc thực hiện thông thường các giao tiếp đệm sử dụng bộ đệm tròn và bạn quản lý chúng bằng số học modulus.

2

Đối với các ngôn ngữ không có nhà khai thác bitwise, mô-đun có thể được sử dụng để nhận được số bit n thấp nhất của một số. Ví dụ, để có được 8 bit thấp nhất của x:

x % 256 

tương đương với:

x & 255 
+2

Điều này không đủ chung chung, chỉ hoạt động cho 2^n. – Gob00st

+2

Điều quan trọng cần lưu ý là công thức đó chỉ hoạt động đối với các giá trị không âm của x. Nếu x là âm, 'x & 255' sẽ báo cáo chính xác các bit thấp hơn, trong khi ở hầu hết các trình biên dịch (bao gồm tất cả các tiêu chuẩn mới nhất) x% 256 sẽ sinh ra rác. – supercat

4

Tôi thường sử dụng chúng trong vòng chặt chẽ, khi tôi phải làm một cái gì đó mỗi X vòng như trái ngược để trên mỗi iteration ..

Ví dụ:

int i; 
for (i = 1; i <= 1000000; i++) 
{ 
    do_something(i); 
    if (i % 1000 == 0) 
     printf("%d processed\n", i); 
} 
+1

Trên một số triển khai, điều này có thể rất tốn kém. –

3

Đối với số kiểm soát của n tài khoản ngân hàng quốc tế umbers, mod97 technique.

Cũng theo lô lớn để thực hiện điều gì đó sau n lần lặp lại. Dưới đây là ví dụ cho NHibernate:

ISession session = sessionFactory.openSession(); 
ITransaction tx = session.BeginTransaction(); 

for (int i=0; i<100000; i++) { 
    Customer customer = new Customer(.....); 
    session.Save(customer); 
    if (i % 20 == 0) { //20, same as the ADO batch size 
     //Flush a batch of inserts and release memory: 
     session.Flush(); 
     session.Clear(); 
    } 
} 

tx.Commit(); 
session.Close(); 
Các vấn đề liên quan