查找该系列的最后十位数字,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的错误..抱歉我的英文,谢谢。
答案 0 :(得分:1)
BigInteger b = null;
因此,在第一次迭代中,当您执行b.add(a.modPow(a, c));
时,b
为null
答案 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