2010-06-11 68 views
0

我想編寫一個簡單的代碼行,而不訴諸if語句,它會評估一個數字是否在一定範圍內。我可以通過使用模數從0 - Max評估。數學模型包含數字

30 % 90 = 30 //great 

然而,如果測試數量是大於最大值,採用模數將簡單地從0開始它的剩餘,在那裏,因爲我想將它限制到最大,如果是過去最大

94 % 90 = 4 //i would like answer to be 90 

無論如何,如果我介紹範圍的最小值,它變得更加複雜。例如:

minimum = 10 
maximum = 90 

因此,任何編號i評估應該是在範圍之內,或者如果它是以下範圍,最大值,如果是上述範圍

-76 should be 10 
2 should be 10 
30 should be 30 
89 should be 89 
98 should be 90 
23553 should be 90 

最小值是能夠評價這與一行代碼沒有使用if語句?

+0

如果您指定正在使用的語言它幫助。 – Amber 2010-06-11 03:01:16

+0

對不起。我沒有說我的語言,因爲我認爲大多數語言都有相同的運算符或數學方法。 – TheDarkIn1978 2010-06-11 05:36:32

回答

3

也許最簡單的方法是使用任何maxmin在你的語言是這樣可供選擇:

max(10, min(number, 90)) 

在某些語言中,例如Java,JavaScript和C#(可能還有其他)maxminMath類的靜態方法。

我已經使用了clip功能,使其更容易(這是在JavaScript):

function clip(min, number, max) { 
    return Math.max(min, Math.min(number, max)); 
} 
+0

優秀!這比嘗試使用模運算符要容易得多。正是我在找什麼。非常感謝。 – TheDarkIn1978 2010-06-11 04:33:47

0

我不明白你怎麼能...

(X/10)< 1? 10:(X/90> 1→90:X)

數除以10小於1?設置爲10 否則 如果除以90數大於90,爲90 否則 設置x

注意,它仍然隱藏IFS。 :(

+0

另外請注意,你應該採取一粒鹽的那些parens的位置! :) – 2010-06-11 03:06:07

1

用C/C++:。

value = min*(number < min) + 
     max*(number > max) + 
     (number <= max && number >= min)*number%max; 

以下是一個簡要說明請注意,代碼依賴於2個重要的問題,以正常工作首先,在C/C++一個布爾表達式可被轉換一個負數的提示是它自己的數字,所以它不是餘數的數學定義,我不確定這是由C/C++標準定義還是留給了基本上:

if number < min then: 
    value = min*1 + 
      max*0 + 
      0*number%max; 
else if number > max 
    value = min*0 + 
      max*1 + 
      0*number%max; 
else 
    value = min*1 + 
      max*1 + 
      1*number%max; 
1

如果您使用的是語言GE具有三元運算符(如C或Java),則可以做到這一點是這樣的:

t < lo ? lo : (t > hi ? hi : t) 

其中t是測試變量,和低和高是極限。這符合你的約束,因爲它不嚴格使用if語句,但三元運算符實際上只是if語句的語法糖。

3

簡單,但仍分支即使if不使用:

r = (x < minimum) ? minimum : (x > maximum) ? maximum : x; 

bit twiddling hacks,假定(2 < 3)== 1:

r = y^((x^y) & -(x < y)); // min(x, y) 
r = x^((x^y) & -(x < y)); // max(x, y) 

將其組合在一起,假定分鐘<最大:

r = min^(((max^((x^max)&-(max<x)))^min)&-(x<min)); 

怎麼回事工作時x<y

r = y^((x^y) & -(x < y)); 
r = y^((x^y) & -(1)); // x<y == 1 
r = y^((x^y) & ~0); // -1 == ~0 
r = y^(x^y); // (x^y) & ~0 == (x^y) 
r = y^ x^y; // y^y == 0 
r = x; 

否則:

r = y^((x^y) & -(x < y)); 
r = y^((x^y) & -(0)); // x<y == 0 
r = y^((x^y) & 0); // -0 == 0 
r = y; // (x^y) & 0 == 0