实施 (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
是除数。
希望对您有所帮助。如果您想了解为什么会发生这种情况,请发表评论,我很乐意编辑我的答案来帮助您。
我有三个整数 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
是除数。
希望对您有所帮助。如果您想了解为什么会发生这种情况,请发表评论,我很乐意编辑我的答案来帮助您。