实施 (A ^ B) % C 即,pow(A, B) % C

Implementing (A ^ B) % C i.e, pow(A, B) % C

我有三个整数 A、B 和 C。我需要实现一个程序来执行 A^B 模 C 运算。 我想也没想就写了下面的代码:-

public int Mod(int A, int B, int C) 
{
    return (int)Math.pow(A,B) % C;
}

测试用例:A = -1,B = 1,C = 20,预期的 o/p 是 19,而我的代码给出了 -1 作为输出。

我发现当存在负数时这种方法是不正确的,在这个例子中,当 A < 0 时。 我参考了几个网站的解释,但无法理解这种行为。 请帮我解决这个问题。谢谢。

Java中没有'modulus'运算符;有一个 remainder operator.

负一的一次次方是负一

负一除以20的余数为负一

JLS(上文link)明确表示结果的符号与左边的符号相同。因此 -1 而不是 +19.

%的定义是

The remainder operation for operands that are integers after binary numeric promotion (§5.6.2) produces a result value such that (a/b)*b+(a%b) is equal to a.

% Java

中的运算符

在java,计算时

A % B

答案根据以下条件产生:

分红为负数时,产生的答案也将是负数,而当红利是正的,产生的答案也会是正的

请注意,此行为是特定于语言的。在 python 中,上述程序将产生 19 作为输出。


代码中的缺陷

如果只想A % B产生正结果,那么简单地使用A % B会产生错误输出因为上面提到的原因

此外,计算 A^B % C 其中 B 可以直接取大值不是正确的方法。我建议您使用 fast exponentiation 来这样做。这是一个著名的算法,您可以在网上轻松找到它。


解决方案

如果您只想要阳性结果,请使用:

r = a % b > 0 ? a % b : Math.abs(b) + a % b;

这里r是余数,a是被除数,b是除数。


希望对您有所帮助。如果您想了解为什么会发生这种情况,请发表评论,我很乐意编辑我的答案来帮助您。