Java通过BigInteger获得了权力

时间:2014-08-25 13:57:38

标签: java math biginteger

查找该系列的最后十位数字,1 ^ 1 + 2 ^ 2 + 3 ^ 3 + ... + 1000 ^ 1000

我正在使用Java ..我想我可以为这个问题编写函数。 (BigInteger)这是我的Java代码,但它不起作用。我怎么能这样做?

 public static void main(String[] args) {
    BigInteger a;
    BigInteger b = null;
    BigInteger c = new BigInteger("10000000000");
    for (int i = 0; i <= 1000; i++) {
        a = new BigInteger("" + i);
        b.add(a.modPow(a, c));
    }
    System.out.println(b);
}

我收到NullPointerException的错误..抱歉我的英文,谢谢。

4 个答案:

答案 0 :(得分:1)

BigInteger b = null;

因此,在第一次迭代中,当您执行b.add(a.modPow(a, c));时,bnull

答案 1 :(得分:1)

我认为你有两个基本错误,首先你从未初始化b - 可能是

BigInteger b = BigInteger.ZERO;

然后,您需要将b.add(a.modPow(a, c));的结果分配给b(因为BigInteger添加不会就地修改)。也就是说,

b = b.add(a.modPow(a, c));

当我进行这两项更改时,我得到输出

4629110846701

答案 2 :(得分:0)

null不是零值。使用0像这样

初始化变量
BigInteger b = new BigInteger("0");

即使如peter.petrov所说,这个问题可以通过一个更简单的解决方案来解决,而不使用大整数

答案 3 :(得分:0)

import java.math.BigInteger;

class Main {
    public static void main(String[] args) {
        BigInteger num = BigInteger.ZERO;
        for (int i = 1; i <= 1000; i++) {
            num = num.add(BigInteger.valueOf(i).pow(i));
        }
        BigInteger res = num.mod(new BigInteger("10000000000"));
        System.out.println(res);
    }
}

输出:

9110846700

http://www.mathblog.dk/project-euler-48-last-ten-digits/获取更有效的解决方案,因为biginteger在非常大的数字上变得非常慢

import java.io.InputStream;

class Main {
    public static void main(String[] args) {
        long result = 0;
        long modulo = 10000000000L;

        for (int i = 1; i <= 1000; i++) {
            long temp = i;
            for (int j = 1; j < i; j++) {
                temp *= i;
                temp %= modulo;
            }

            result += temp;
            result %= modulo;
        }
        System.out.println(result);
    }

输出:

9110846700