尝试解决 Project Euler 问题 119:
数字 512 很有趣,因为它等于其数字之和的某个幂:5 + 1 + 2 = 8,并且 8^3 = 512。具有此属性的数字的另一个示例是 614656 = 28^4。
我们将定义 an 为该序列的第 n 项,并坚持一个数字必须包含至少两位数字才能有和。
给定 a2 = 512 和 a10 = 614656。
找到a30。
问题:有没有比只检查每个数字直到找到 a30 更有效的方法来找到答案?
我的代码
int currentNum = 0;
long value = 0;
for (long a = 11; currentNum != 30; a++){ //maybe a++ is inefficient
int test = Util.sumDigits(a);
if (isPower(a, test)) {
currentNum++;
value = a;
System.out.println(value + ":" + currentNum);
}
}
System.out.println(value);
isPower 检查 a 是否是检验的幂。Util.sumDigits:
public static int sumDigits(long n){
int sum = 0;
String s = "" + n;
while (!s.equals("")){
sum += Integer.parseInt("" + s.charAt(0));
s = s.substring(1);
}
return sum;
}
程序已经运行了大约 30 分钟(可能会溢出)。输出(到目前为止):
81:1
512:2
2401:3
4913:4
5832:5
17576:6
19683:7
234256:8
390625:9
614656:10
1679616:11
17210368:12
34012224:13
52521875:14
60466176:15
205962976:16
612220032:17