当我在Java中执行以下计算(97 ^ 23) mod 187
时:
double ret = (Math.pow (97, 23))% 187;
ret值为74
。 (Math.Pow (97, 23))
的值为4.963064143419832E45;
我的问题如下:表达式(97 ^ 23) mod 187 = 58
的值。尝试做Windows计算器。我尝试过使用BigDecimal
但仍然无法获得我需要的值。
在Windows计算器中生成(97 ^ 23)
,它会返回4.9630641434198319969863989680919 +45
并且更精确。
如果有人可以帮助我,非常感谢你!
答案 0 :(得分:2)
模块化功能在BigInteger
类中实现:
BigInteger a = new BigInteger("97");
BigInteger x = new BigInteger("23");
BigInteger m = new BigInteger("187");
BigInteger result = a.modPow(x, m); // 97^23 % 187
要将结果作为int获取,您可以使用intValue()
方法。
答案 1 :(得分:0)
您是否尝试过将问题考虑在内?即r =(r * 97)%187;并重复23次?这里有一些伪Java(我附近没有编译器来验证语法,但我用另一种语言测试了逻辑,看起来没问题):
public static abmodn(int a, int b, int n)
{
int r = 1 % n;
while (b-- > 0)
{
r = (r * a) % n;
}
return r;
}
abmodn(97, 23, 187)
返回58
。
答案 2 :(得分:0)
如果没有舍入错误,您不能指望该大小的数字的浮点计算(请参阅here)。
即使你在技术上不需要BigDecimal
,因为你没有小数部分,它仍然可以正确计算,如:
import java.math.BigDecimal;
公共课测试{
public static void main(String []args){ BigDecimal bdn = new BigDecimal(97); BigDecimal bdx = bdn.pow(23); BigDecimal bdr = bdx.remainder(new BigDecimal(187)); System.out.println("bd3: " + bdr); // bd3: 58 } }