4

与えられた整数が範囲の範囲内にあるかどうかをチェックするコードを考え出す必要があります。(範囲は整数のペアで表されます。)

したがって、rとして定義された範囲std::pair<int, int>とテスト整数が与えられた場合、次のnように言います。

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

問題は、これを行うために比較ファンクターを使用する必要がstd::less<int>あるということです。つまり、より小さい演算子でしか作業できません。

私は同等の表現を考え出そうとしています。私はそれが正しいと確信していますが、完全に自信があるわけではありません。

私が思いついた表現は次のとおりです。

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

cmpのインスタンスはどこですかstd::less<int>

私はそれを正しくしましたか?

4

3 に答える 3

8

他の人をポーリングすることは、正しさを確認するための最良の方法ではありません。:)

代わりに、問題を検討してください。扱っているものはすべて。であるintため、関連するすべての値は。として表すことができますint。足し算や引き算は必要ないので、表現可能な範囲を離れることを心配する必要はありません。したがって、標準の整数を使用して標準の数学にフォールバックし、マシン表現の乱雑さを残すことができます。

両端で閉じた範囲と、その範囲のメンバーシップをテストするため[n, m]の値が与えられます。p使用できる整数に対して1つの演算子があります<。すべての標準ブール演算子は公正なゲームです。

今、あなたは簡単にセットについて考えることができます。あなたはそのpようなすべてを拒否したいp < nまたはp > m。の他のすべての値pは許容されます。言い換えれpば、次の場合に必要なセットの一部です

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

ド・モルガンの法則を使用すると、これは次のようになります。

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

(によって提供される代替スペルではなく<iso646.h>)標準のC ++演算子を使用して、提案されたものを取得しますが、異なる名前を使用することを表します。

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

、to 、to 、toに名前を変更<()すると、あなたが提案したものが正確に得られます。cmp()nr.firstmr.secondpn

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

だから、うん、私には正しいように見える。

于 2010-10-18T23:05:09.830 に答える
2

はい、以下ではありません-以上は以上と同等です。実際、多くの古いプログラミング言語<=では、実際にはngt以下が必要であり、>=はnlt

于 2010-10-18T22:46:49.337 に答える
2

短い答え:

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

これは、「num」が「min」と「max」の間にあるが、どちらとも等しくない場合にtrueを返します。

範囲チェックに「min」と「max」を含める必要がある場合は、次を使用します。

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
于 2010-10-18T23:09:30.473 に答える