2010-06-16 43 views
8

Tôi đang cố gắng xây dựng một công thức nhỏ (hoặc có lẽ không quá nhỏ) sẽ chứa các số giữa một phút và tối đa, nhưng cũng lặp lại những con số này để chúng không bị cắt bớt nếu chúng nằm ngoài phạm vi. cho đến nay, đây là những gì tôi có.Math Looping giữa Min và Max Sử dụng Mod?

min1 = 10 
max1 = 90 

val1 = 92 
//will make 11, which is what i want since it loops 

formula: min(max(min1,min(val1,max1)),mod(val1,max1)+min1) 

Tuy nhiên, tôi muốn nó để lặp theo một hướng khác cũng có, do đó nếu VAL1 là 5, mà là -5 ngoài min1, nó sẽ trở thành 86.

một vấn đề khác tôi chạy vào đó là

max1 % max1 != max1 

như tôi muốn nó, vì max là một phần của dãy

cố gắng để được rõ ràng, đây là một số ví dụ về các đầu ra mong muốn dựa trên một loạt với looping

min1 = 10 
max1 = 90 
---------------------------------------------- 
val1 = 30 //within range: stays as 30 
val1 = 90 //within range: stays as 90 
val1 = -6 //below range: loops to becomes 75 
val1 = 98 //above range: loops to becomes 17 
val1 = 91 //above range: loops to becomes 10 

tôi muốn không sử dụng hàng loạt câu lệnh if/else, nhưng sẽ ổn nếu hoàn toàn bắt buộc. thậm chí có thể không?

+0

Tôi nghĩ rằng ví dụ cuối cùng của bạn nên được 17 chứ không phải 18 kể từ khi bạn nên đếm 10 quá. Phải không? Bạn thực sự muốn 91 được 11 và không 10 trong khi 90 là 90? –

+0

90 có còn 90 và 91 trở thành 11 trong ví dụ của bạn không? Chẳng có gì trở thành 10 rồi sao? Điều gì sẽ xảy ra với 170? Nó có trở thành 90 hay 10 không? Điều này khá lạ "looping". Ngoài ra, làm thế nào có thể -6 trở thành 84? -6 là 16 số xa tối thiểu, vì vậy nó phải là khoảng 90-16 = 74, hoặc những gì? – Rotsor

+0

oh .. ha ... yeah, tôi hoàn toàn viết sai. -6 nên 74, không phải 84. xin lỗi. – TheDarkIn1978

Trả lời

3
int loop(int val, int min, int max) 
{ 
    int p = max-min+1; 
    int mod = (val-min)%p; 
    if(mod<0) 
     mod += p; 
    return min+mod; 
} 
+0

Tại sao không chỉ bắt đầu với 'if (val == max) trả về max;'? –

+0

Bởi vì anh ta có thể muốn 170 để trở thành 90 quá. Dù sao, cả hai cách dường như vô dụng đối với tôi. – Rotsor

+0

Tôi rất tiếc. Tôi đã gây hiểu lầm cho bạn kể từ khi tôi đã có logic vòng lặp của tôi hơi say lên. bạn nhận thấy trước đó nhưng tôi đã không hoàn toàn hiểu cho đến bây giờ. 91 nên là 10, không phải 11. 9 nên trở thành 90, vv để làm cho vòng lặp chính xác. – TheDarkIn1978

1

Xin lỗi. Đã xóa câu trả lời trước đó. Hãy thử điều này một:

((val-min)% (max-min) + max-min)% (max-min) + phút

EDIT: nếu bạn muốn tối đa là một giá trị hợp lệ thay vì tràn xuống min, thay thế max bằng max + 1 ở cả 3 vị trí.

+0

Ai sử dụng hai bộ phận thay vì một bộ phận?:) Ngoài ra, 90 sẽ trở thành 10. – Rotsor

+0

xin lỗi pavel, tôi đã chỉnh sửa câu hỏi của mình vì tôi đã nhầm lẫn logic lặp của mình. – TheDarkIn1978

+0

@rotsor: \t \t int Modulo (int x, int y) \t \t { \t \t \t int câu trả lời = x% y; \t \t \t câu trả lời trả về <0? answer + std :: abs (y): trả lời; \t \t} –

1

Về mặt toán học, bạn sẽ có thể làm điều gì đó như thế này:

((val-min) `mod` (max-min+1)) + min 

Di chuyển phạm vi của bạn xuống là zero-based, cắt ra khỏi cuối cao, và chuyển nó trở lại phạm vi quyền. Thật không may, toán tử% trong C cho kết quả âm cho các số âm. Vì vậy:

3 % 10 => 3 
13 % 10 => 3 
-3 % 10 => -3 
-13 % 10 => -3 

Vì vậy, để thoát khỏi những tiêu cực, chúng ta cần thêm một modulo:

((val-min)%(max-min+1) + (max-min+1)) % (max-min+1) + min 
+0

Đây chính là điều tôi và Pavel đang làm, nhưng giải pháp của bạn không kiểm tra val val Rotsor

+0

Re Rotsor: điều đó nên khắc phục. – Karmastan

Các vấn đề liên quan