我正在尝试创建一个使用modular arithmetic的简单函数。这实际上是一个环绕的数字线。具体来说,我想在Java中使用Mod 8数字行。
我想要的是比较0到7之间的两个数字。我想减去这些数字以获得差异分数。然而,不是0-7 = -7,我希望它等于1.想法是在你到达7之后,数字线回绕到0(因此0和7只是一个空格。)
是否有符合此标准的套餐?
答案 0 :(得分:5)
((0-7)+8) % 8
怎么样?这应该可以解决你的问题。
注意:%是Modular运算符。
答案 1 :(得分:4)
似乎你想要反转负数用模数做什么。请记住,模数是整数除法后的余数。通常你会有一个如下所示的范围:
-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
对于同一系列值,您希望它看起来像这样:
1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
如果你想解决一般情况,你可以有任何负数(这样它可以用于-15,-20,-27以及-7)那么你必须在模数后调整它,像这样:
int m = x % 8;
m = (m < 0) ? m + 8 : m;
基本上这会留下正面情况,并会调整负面情况,以便数字翻转,如你所愿。
使用直接数学运算的另一种方法是采用模数两次:
int m = ((x % 8) + 8) % 8
第一个模数为您提供从-7到7的预期范围。加法调整负模数使其为正值,但当然将正值移动到7以上。第二个模数确保所有答案都在范围0到7.这适用于任何负数和任何正数。
答案 2 :(得分:0)
听起来你需要使用%modulo运算符。也许写一组与模数学一起工作的整数函数,例如。 Modulo plus将是=(a + b)%8;
答案 3 :(得分:0)
modulo operation就是你想要的。但是,Java中的%
运算符(通常称为模数)不是数学模。它更像是余数运算符。差异是微妙的,往往是无关紧要的。如果你有像你的情况一样的负面参数,这一点非常重要。我认为Wikipedia可以解释确切的差异。
因为你“环绕”你需要modulo的数学版本,遗憾的是它没有在Java for Integer中实现。但是,BigInteger类有一个mod()函数,它可以完全满足你的需要:
BigInteger.valueOf(0-7).mod(BigInteger.valueOf(8)).longValue()
它不漂亮但有效。
答案 4 :(得分:-2)
嗯...有内置的模数运算符 %
,它基本上也存在于其他所有流行的语言中。