实施 (A ^ B) % C 即 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

解决方法

% 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 是除数。


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

,

Java 中没有“模数”运算符;有一个 remainder operator

负一的次幂为负一。

负一除以 20 余数为负一。

JLS(上面的链接)特别说明结果的符号与左侧的符号相同。因此 -1 而不是 +19。

% 的定义是

二进制后为整数的操作数的余数运算 数字提升(第 5.6.2 节)产生的结果值使得 (a/b)*b+(a%b) 等于 a。