2010-10-18 50 views
2

我需要想出一些代碼來檢查給定的整數是否落入範圍的範圍內。給定定義爲std::pair<int, int>範圍r,以及測試整數n(該範圍由一對整數來表示)檢查整數是否落入範圍內僅使用<運算符

所以,我想說:

if (n >= r.first && n <= r.second)

美中不足的是,我需要使用std::less<int>比較函子來做到這一點,這意味着我只能使用less運算符。

我試圖想出相應的表達式。我很確定我是否正確,但我並不完全有信心。

我想出的表達式是:

(!cmp(n, r.first) && !cmp(r.second, n))

其中cmpstd::less<int>

一個實例我做對了嗎?

+1

「我有沒有正確地做到這一點? 「是。 – aschepler 2010-10-18 22:46:54

+0

這是功課嗎?很難看出爲什麼你不能在已知的'int'值上使用完整的運算符。 – 2010-10-18 23:17:01

回答

7

輪詢別人是不驗證正確性的最佳方法。 :)

相反,考慮你的問題。您所處理的每件事都是int,因此所有涉及的值都可以表示爲int。不涉及加法或減法,所以您不必擔心離開可表示的範圍。因此,我們可以使用標準整數迴歸標準數學,並將機器表示的混亂留下。

您會得到一個範圍爲[n, m]和值爲p的範圍,以測試該範圍內的成員資格。你可以使用一個整數運算符,<。所有的標準布爾運算符都是公平的遊戲。

現在,你可以簡單地思考套。您要拒絕所有p,例如p < np > mp的所有其他值均可接受。換句話說,p是所希望的設定的一部分,如果

not ((p < n) or (m < p)) 

使用狄摩根法律,這等同於

(not (p < n)) and (not (m < p)) 

表示使用標準的C++運營商(而不是由<iso646.h>提供的備選拼寫),我們得到你的建議,但使用不同的名稱:

!<(p, n) && !<(m, p) 

更名<()cmp()nr.firstmr.second,並pn,我們給你提出的正是:

!cmp(n, r.first) && !cmp(r.second, n) 

所以,是的,看起來是正確的我。

2

是的,不是低於等於大於或等於,其實在很多老的編程語言<=實際上是所謂ngt不大於和> =爲nlt

0

簡短的回答:

if (num < max && !(num <= min)) { // stuff to do } 

如果「民」是「最小」和「最大」之間,但不等於其中任何這將返回true。

如果你需要它包括的範圍檢查,使用「最小」和「最大」:

if (num <= max && !(num < min)) { // stuff to do } 

這工作,因爲...

!(A > B) == (A <= B) // If not greater than B, must be less than or equal to B 
!(A >= B) == (A < B) // If not greater or equal to B, must be less than B 

!(A < B) == (A >= B) // If not less than B, must be greater or equal to B 
!(A <= B) == (A > B) // If not less than or equal to B, must be greater than B 
+1

如果num == max,我很確定他想要包含範圍 – tobyodavies 2010-10-19 00:10:36

+0

是的,包含在其中,請參閱第二個代碼片段。 – 2010-10-19 04:21:58