使用大量数字

时间:2013-06-22 23:40:02

标签: java bigdecimal

当我在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并且更精确。

如果有人可以帮助我,非常感谢你!

3 个答案:

答案 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
 } }