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]));
}

您在上面看到的是我从某个地方获取的片段。有两种逻辑表达式。据说,注释掉的那个和没有注释掉的那个是一样的。

你如何获得:

((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]),我们要说的是,只有当与 和 的关系与从 到 的关系相反时,这才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,因为评估为 true两侧的两个术语,意味着!=评估为false。这种情况还会导致第二个语句解析为 false,因为您没有围绕||评估为 true 的两个术语中的任何一个,它们都评估为 false。

最后,这个问题对我来说看起来像是家庭作业——如果是,你应该使用适当的标签。

a[i] == a[j]但是,这一切都忽略了or的可能性b[i] == b[j],该问题的另一个答案表明,这可能导致两个语句无法评估为同一事物。但是,如果您假设两者不能相等,那么您的问题中的两个陈述将是相同的,遵循上面演示的逻辑。

于 2012-06-15T23:00:53.803 回答
0

这些表达式是不等价的。

例如,当a[i] == a[j]和时b[i] > b[j],第一个表达式给出...

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

...而第二个给出:

((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,但不是两者 这是一个已知的布尔运算,称为XOR,在您的情况下与不同的(!=)相同

所以:

ans += A != B;

并扩展:

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

所以:

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

希望现在很清楚。

于 2012-06-15T23:04:36.600 回答
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 回答