Đối với bất kỳ số nguyên đầu vào W giới hạn bởi phạm vi R = [x, y], các "tràn", vì thiếu một thuật ngữ tốt hơn, trong W qua R là W % (y-x+1) + x
. Điều này làm cho nó quấn lại xung quanh nếu W vượt quá y.Có một biểu thức bằng cách sử dụng modulo để làm backwards wrap-around ("reverse overflow")?
Như một ví dụ về nguyên tắc này, giả sử chúng ta lặp qua tháng của lịch:
int this_month = 5;
int next_month = (this_month + 1) % 12;
nơi cả hai số nguyên sẽ là từ 0 đến 11, bao gồm. Do đó, biểu thức ở trên "kẹp" số nguyên vào phạm vi R = [0,11]. Cách tiếp cận sử dụng biểu thức này đơn giản, thanh lịch và thuận lợi vì nó bỏ phân nhánh.
Bây giờ, nếu chúng ta muốn làm điều tương tự, nhưng ngược lại thì sao? Biểu thức sau đây hoạt động:
int last_month = ((this_month - 1) % 12 + 12) % 12;
nhưng không thể hiểu được. Làm thế nào nó có thể được làm đẹp?
tl; dr - Có thể biểu hiện ((x-1) % k + k) % k
được đơn giản hóa hơn nữa?
Lưu ý: Thẻ C++ được chỉ định vì các ngôn ngữ khác xử lý toán hạng âm cho toán tử modulo khác nhau.
'((x-1) + k)% k' là giải pháp! – CpILL
Số '-1' không thể thấp hơn thì' - (k-1) ' –