Java 查找特殊整数,代码效率不够

Java 查找特殊整数,代码效率不够,java,Java,我正在解决euler问题108,因此我想找到整数n,这样就有1000个组合:1/I+1/t=1/n(I和t是随机数)。我的代码: int counter = 0; for (int n = 10000; n < 200000; n++) { for (int i = n; i < 1000000; i++) { for (int t = i; t < 1000000; t++) { if ((n

我正在解决euler问题108,因此我想找到整数
n
,这样就有1000个组合:
1/I+1/t=1/n
I
t
是随机数)。我的代码:

int counter = 0;

    for (int n = 10000; n < 200000; n++) {
        for (int i = n; i < 1000000; i++) {
            for (int t = i; t < 1000000; t++) {
                if ((n * (i + t)) == (i * t)) {                     
                    counter++;
                    if (counter == 1000) {
                        System.out.println("Counter: " + counter);
                        System.out.println("N: " + n);
                        System.exit(0);
                    }                       
                }
            }           
        }   
        counter = 0;
    }
int计数器=0;
对于(int n=10000;n<200000;n++){
对于(int i=n;i<1000000;i++){
对于(int t=i;t<1000000;t++){
如果((n*(i+t))==(i*t)){
计数器++;
如果(计数器==1000){
系统输出打印项次(“计数器:+计数器);
System.out.println(“N:+N”);
系统出口(0);
}                       
}
}           
}   
计数器=0;
}

然而,这并没有终止。怎么会?我为每一轮重置计数器,并检查它是否达到值1000。

您的循环需要太多时间才能终止

每个循环中都有相当多的步骤,这些步骤是通过时间复杂度的乘法来计算的(
O(loopIter1*loopIter2*loopIter3)
),这导致了相当大的时间问题

正如@BorisTheSpider所提到的,您的循环将导致2e17迭代,这需要几年(或几十年)的时间来终止-好吧,不建议等待那么久:)

还要考虑您可能超过一个整数变量。 虽然这可能不会导致Java中的溢出或下溢,但仍可能导致意外行为,例如,在整数变量达到
integer.MAX\u值
(即2^32-1)后,增量将使其值
integer.MIN\u值
,依此类推

在int max value超过上述值的情况下,某些检查可能会失败:认为
Integer.max\u value>1000
,但
Integer.max\u value+1
将导致
Integer.MIN\u value<1000


在您的代码中,它似乎并没有直接影响它,但是我会认真考虑您的计算中的这种效果。

您的循环花费太多的时间来终止。 每个循环中都有相当多的步骤,这些步骤是通过时间复杂度的乘法来计算的(

O(loopIter1*loopIter2*loopIter3)
),这导致了相当大的时间问题

正如@BorisTheSpider所提到的,您的循环将导致2e17迭代,这需要几年(或几十年)的时间来终止-好吧,不建议等待那么久:)

还要考虑您可能超过一个整数变量。 虽然这可能不会导致Java中的溢出或下溢,但仍可能导致意外行为,例如,在整数变量达到
integer.MAX\u值
(即2^32-1)后,增量将使其值
integer.MIN\u值
,依此类推

在int max value超过上述值的情况下,某些检查可能会失败:认为
Integer.max\u value>1000
,但
Integer.max\u value+1
将导致
Integer.MIN\u value<1000


在你的代码中,它似乎并没有直接影响它,但是我会认真考虑你的计算中的这种效果。

PrimeCultule的精神是自己找到答案。有1000000×1000000×200000迭代,即<代码> 2E17迭代。即使你每秒运行1亿次迭代,也要60年以上……你至少需要一台大型机来终止这一点:-)ProjectEuler的精神是自己寻找答案。有1000000*1000000*200000次迭代,也就是
2e17
次迭代。即使你每秒运行1亿次迭代,这仍然超过60年……你至少需要一台大型机来终止这一过程:-)然后需要什么样的调整?考虑到它基本上只包含for循环,我无法理解如何使这段代码更有效。@JavaCoder项目Euler的挑战总是关于理解底层的数学,而不是暴力。事实上,它们是专门设计来不可强制执行的。那么需要什么样的调整呢?考虑到它基本上只包含for循环,我无法理解如何使这段代码更有效。@JavaCoder项目Euler的挑战总是关于理解底层的数学,而不是暴力。事实上,它们是专门设计的,不可强制执行。