以下代码用于项目euler问题12.它的目的是找到第一个三角形数字,它有超过500个除数但只是无休止地运行。任何帮助将不胜感激
public class Problem12 {
public static void main(String[] args) {
int[] array = new int[20000];
long trinumber = 1;
int j;
for (int i = 1;; i++) {
j = 0;
for (int k = 1; k <= trinumber; k++) {
if (trinumber % k == 0) {
array[j] = k;
j++;
}
}
if (array[500] != 0) {
System.out.println(trinumber);
return;
}
trinumber += i;
array = new int[array.length];
}
}
}
答案 0 :(得分:1)
您正在计算错误的三角数序列
问题在于:trinumber += i;
请注意,您案例的第二个三角形数字不是3,而是2
您应该在最外面的for循环之后直接移动该行代码
另外,将变量trinumber
初始化为0而不是1:将此long trinumber = 1;
更改为:long trinumber = 0;
您不需要变量array
,而是使用计数器并在找到新除数时递增它,而不是在此之后检查该计数器是否等于500。
编辑:
以下是建议编辑的最终结果:
public static void main(String[] args) {
System.out.println(System.currentTimeMillis());
long trinumber = 0;
for (int i = 1;; i++) {
int numDivisors = 0;
trinumber += i;
for (int k = 1; k <= trinumber; k++) {
if (trinumber % k == 0) {
numDivisors++;
}
}
if (numDivisors > 500) {
System.out.println(trinumber);
System.out.println(System.currentTimeMillis());
return;
}
}
}
有问题的数字是:76576500,我的机器上花了17个多小时才完成。因此,需要一些数学提示来改善该算法的运行时间。
答案 1 :(得分:0)
我对这个程序做了一些改动。希望这会有所帮助。 我的机器运行netbeans花了182分钟
public static void main(String[] args) {
long triNumber=0;
int j=0;
for (int n=0;;n++){
triNumber=n*(n+1)/2; //Triangular number calculation
for (int i=1;i<=triNumber;i++){
if(triNumber%i==0){
j++;
}
}
if (j>=500){
System.out.println(triNumber);
break;
}
j=0;
}
}
第一个三角形数字是76576500,有超过500个除数 建立成功(总时间:182分44秒)