问题描述
如何在模数意义上(mod 3)检查 x 是否比 y 大 1(领先)?
这是当 x = 0 和 y = 2 时,当 x = 1 时,y = 0,当 x = 2 时,y = 1。
我尝试过这样的测试:
PHP -a
PHP > $x = 0;
PHP > $y = 2;
PHP > echo ($x - $y) % 3;
-2
PHP > $x = 1;
PHP > $y = 0;
PHP > echo ($x - $y) % 3;
1
PHP > $x = 2;
PHP > $y = 1;
PHP > echo ($x - $y) % 3;
1
它不适用于 x = 0 和 y = 2 的情况。我该如何计算,以便在模数意义上 $x 比 $y 领先 1 倍?
解决方法
我先解释一下我对你下面这句话的理解:
如何在模数意义上(mod 3)检查 x 是否比 y 大 1(领先)?
根据提供的示例,我假设您的意思是,如果将 1 添加到 $y,并且我们取 $y 的 mod 3,我们将获得 $x 的 mod 3。
考虑到这一点,我们可以编写以下代码,如果 $x “领先” $y 1 则女巫将返回 true。(我希望您可以将该示例抽象为您面临的任何情况):
>function check($x,$y,$mod) {
return $x % $mod == ($y + 1) % $mod;
}
//$x = 0 and $y = 2
echo check(0,2,3); //returns true
//$x = 1 and $y = 0
echo check(1,3); //returns true
//$x = 2 and $y = 1
echo check(2,1,3); //returns true
//$x = 0 and $y = 1
echo check(0,3); //returns false because $x is 2 "ahead" of $y
如果你想要一个更通用的函数版本,有任意的差异,你可以使用这个(它应该适用于正负差异):
function check($x,$mod,$diff) {
return $x % $mod == ($y + $diff) % $mod;
}
,
为什么您将 0 用于 x
,将 2 用于 y
? (抱歉,我不是代数专家。)
尽管您的情况已经非常清楚,但 x
比 y
领先 1 位(显然是 0 < 2
)是没有意义的(至少对我而言)。
正如我们所知,语句 (0 - 2) % 3
将是 -2
,因为 mod 是 3,而 0 - 2
是 -2,所以结果是 -2 .
数学有时可能会有一些不合逻辑的意义(在我看来),因此值得注意的是,0 根本不领先于 2(在编程变量的意义上)。
并且要实际回答有关计算的问题,您可以将 x = 0
和 y = -1
作为变量,根据语句的逻辑本身,然后将两个变量都加 1,然后结果还是一样。
证明:
<?php
$x = 0
$y = -1
echo ($x - $y) % 3 // outputs 1
echo (++$x - ++$y) % 3 // still outputs 1
echo (++$x - ++$y) % 3 // also outputs 1
echo (++$x - ++$y) % 3 // yep,still the same
echo (++$x - ++$y) % 3 // alright,you get the deal
?>