-1 chia 3 dư mấy?
Modulo, hay được hiểu là số dư của phép chia. Năm 1801, Gauss xuất bản một cuốn sách bao gồm modulo arithmetics. Sau đó, một định nghĩa được chấp nhận rộng rãi đưa ra bởi thiên tài Donald Knuth người viết những quyển sách thách thức cả thế này.
Như ví dụ trên, để tránh các lỗi không mong muốn, dù index là bao nhiêu nó cũng sẽ trả về giá trị thuộc mảng [3,4,5].
Nhưng tình huống thực sự hay gặp phải là gì ? Điều gì sẽ xảy ra nếu bạn giá trị a của bạn âm ? Hóa ra lại phụ thuộc vào ngôn ngữ mà bạn đang lập trình, nhìn vào bảng dưới đây ta có thể thấy ngôn ngữ lập trình về vấn đề này chia làm hai phe khác nhau:
Vì vậy, khi làm việc với modulo trên nhiều ngôn ngữ khác nhau, cách tốt nhất để không làm sai lệch đầu ra là HÃY VIẾT HÀM MODULO CỦA CHÍNH MÌNH.
Cảm ơn bạn. Vậy -1 chia 3 dư mấy ? Chào.
mod(a, n) = a - n * floor(a / n)
Hạn chế của nó ?
Trong lập trình, modulo thường được sử dụng để giới hạn một index trong một cấu trúc dữ liệu có giới hạn. (Hiểu đơn giản là tránh một chỉ mục nằm ngoài khoảng không gian cho phép).values = [ 3, 4, 5 ]
index = 100
value_at_index = values[ index % values.length ]
.Như ví dụ trên, để tránh các lỗi không mong muốn, dù index là bao nhiêu nó cũng sẽ trả về giá trị thuộc mảng [3,4,5].
Nhưng tình huống thực sự hay gặp phải là gì ? Điều gì sẽ xảy ra nếu bạn giá trị a của bạn âm ? Hóa ra lại phụ thuộc vào ngôn ngữ mà bạn đang lập trình, nhìn vào bảng dưới đây ta có thể thấy ngôn ngữ lập trình về vấn đề này chia làm hai phe khác nhau:
Language | 13 mod 3 | -13 mod 3 | 13 mod -3 | -13 mod -3 |
---|---|---|---|---|
C | 1 | -1 | 1 | -1 |
Go | 1 | -1 | 1 | -1 |
PHP | 1 | -1 | 1 | -1 |
Rust | 1 | -1 | 1 | -1 |
Scala | 1 | -1 | 1 | -1 |
Java | 1 | -1 | 1 | -1 |
Javascript | 1 | -1 | 1 | -1 |
Ruby | 1 | 2 | -2 | -1 |
Python | 1 | 2 | -2 | -1 |
int mod(a, b) {
c = a % b
return (c < 0) ? c + b : c
}
Trên đây là kiểu ưa thích của các lập trình viên. Bạn có giỏi về đồng dư, hãy thử với cách viết dưới đây:int mod(a, b) {
(((a % b) + b) % b)
}
Số lẻ và số chẵn
Dựa theo bảng trên, cách tốt nhất để kiểm tra một số có lẻ hay chẵn là so sánh nó với 0.
bool is_odd(int n) {
return n % 2 != 0; // could be 1 or -1
}
Nhưng bạn muốn máy tính xử lý nhanh hơn, hãy nghĩ đến hệ cơ số 2, nghĩ đến xử lý bitx % 2n == x & (2n - 1) // for n>0
Tóm tắt lại, xử lý modulo có thể rất hữu ích cho các dev nhưng cũng cần cẩn thận với các trường hợp riêng của nó.Cảm ơn bạn. Vậy -1 chia 3 dư mấy ? Chào.
Nhận xét
Đăng nhận xét