试图解决项目欧拉问题119:项目欧拉#119做出更快
数512是有趣的,因为它等于升高到一些功率的其数字的总和:5 + 1 + 2 = 8 ,并且8^3 = 512。具有这个属性的数字的另一个例子是614656 = 28^4。
我们将定义一个这个序列的第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检查是否是测试的功率。 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
子串部分必须是一个杀手... – assylias
可能有更高效的算法,但所有int /字符串转换可能是昂贵的。你可以分开一些数字,有些数学可能更快。这里%是mod运算符。 '512%10 = 2; 512-2 = 510; 510%100/10 = 1; 510 - 10 = 500; 500%1000/100 = 5; 500 - 500 = 0' – Schwern
@assylias Util.sumDigits运行得非常快,我认为它可能是主体for循环中的迭代。 – Justin