0
{
ans += (a[i] > a[j]) != (b[i] > b[j]);
//ans += ((a[i] > a[j]) && (b[j] > b[i])) || ((a[j] > a[i]) && (b[i] > b[j]));
}

上に表示されているのは、私がどこかから取ったスニペットです。2 つの論理式があります。おそらく、コメントアウトされたものは、コメントアウトされていないものと同じです。

入手方法:

((a[i] > a[j]) && (b[j] > b[i])) || ((a[j] > a[i]) && (b[i] > b[j])) 

このようなものに

(a[i] > a[j]) != (b[i] > b[j])

この種の論理式の単純化に関するガイドや本はありますか?

4

4 に答える 4

1

これは実際には非常に簡単です。

と、 と の関係が からとの関係の反対である(a[i] > a[j]) != (b[i] > b[j])場合にのみ、これが真になるということです。これが成り立つためには、もしが真なら が偽であり、それが真であることを意味します。これは、whenが true であることを意味し、逆も意味します。whenが true である場合も同様です。a[i]a[j]b[i]b[j]a[i]>a[j]b[i]>b[j]b[j]>b[i]a[i]>a[j]b[j]>b[i]a[j]>a[i]b[i]>a[j]

そのすべてを別の方法で言うと、( (a[i]>a[j]) && (b[j]>a[i]) ) || ( (a[j]>a[i]) && (b[i]>b[j]) . そのブール論理は、が真であるのと同じ場合にのみ真になり( (a[i] > a[j]) ) != (b[i] > b[j])ます。

別の例として、 と の両方a[i] > a[j]b[i] > a[j] . この条件では、最初に投稿したものが false であることがわかります。これは、 の両側の 2 つの項が!=true に評価されるため、 が に評価されることを意味!=falseます。この場合も、2 番目のステートメントが false に解決されます。これ||は、true への評価の周りに 2 つの用語のいずれもなく、両方とも false に評価されるためです。

最後に、この質問は宿題のように思えます。宿題の場合は、適切なタグを使用する必要があります。

ただし、これはすべてa[i] == a[j]orの可能性を無視しておりb[i] == b[j]、この質問に対する別の回答が示すように、2 つのステートメントが同じものに評価されない可能性があります。しかし、2 つが等しくないと仮定すると、上記のロジックに従って、質問の 2 つのステートメントは同じになります。

于 2012-06-15T23:00:53.803 に答える
0

これを見てみましょう:

((a[i] > a[j]) && (b[j] > b[i])) || ((a[j] > a[i]) && (b[i] > b[j]))

簡単にするために、これをこれと呼びます。

(w > x) && (y > z) || (x > w) && (z > y)

これは論理的に次のものと同等ではありません:

(w > x) && (y > z) || !(w > x) && !(y > z)

それらは等しくなる可能性があるためですが、それは次のことです。

(w > x) && (y > z) || !(w >= x) && !(y >= z)

(w > x) == (y > z)したがって、単純化して、またはに単純化することができます(w > x) != (z >= y)

于 2012-06-15T23:11:41.340 に答える
0

これらの式は同等ではありません。

たとえば、 when a[i] == a[j]and b[i] > b[j]、最初の式は...

(a[i] > a[j]) != (b[i] > b[j]);
false != true
true

...2番目のものは次のようになります:

((a[i] > a[j]) && (b[j] > b[i])) || ((a[j] > a[i]) && (b[i] > b[j]));
(false && false) || (false && true)
false || false
false
于 2012-06-15T23:01:52.973 に答える
0

あなたが投稿したコードは、あなたがそれを仮定すれば正しいです

!(p > q) == (p < q)

何らかの理由で、平等を無視していることを意味します。

これを念頭に置いて、次のように言いましょう。

a1 = a[i]
a2 = a[j]
b1 = b[i]
b2 = b[j]

次に、次のようになります。

ans += ((a1 > a2) && (b2 > b1)) || ((a2 > a1) && (b1 > b2));

平等を無視しているので、これは次と同じです。

ans += ((a1 > a2) && !(b1 > b2)) || (!(a1 > a2) && (b1 > b2));

よく見ると、式が繰り返されていることがわかります。したがって、式を簡略化できます。

A = a1 > a2
B = b1 > b2

それで:

ans += (A && !B) || (!A && B);

これはA または B のいずれかを意味しますが、両方意味ません。

したがって:

ans += A != B;

そして展開:

ans += (a1 > a2) != (b1 > b2)

そう:

ans += (a[i] > a[j]) != (b[i] > b[j])

それが今はっきりしていることを願っています。

于 2012-06-15T23:04:36.600 に答える