【问题标题】:Finding special integer, code not efficient enough [duplicate]寻找特殊整数,代码效率不够[重复]
【发布时间】:2016-03-12 16:07:06
【问题描述】:

我正在解决欧拉问题 108,因此我想找到整数 n,以便有 1000 个组合:1/i + 1/t = 1/nit 是随机数)。我的代码:

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;
    }

但是,这不会终止。怎么来的?我为每一轮重置计数器并检查它是否达到了 1000。

【问题讨论】:

  • ProjectEuler 的精神是自己寻找答案。
  • 有 1,000,000 * 1,000,000 * 200,000 次迭代,即2e17 迭代。即使您每秒运行 1 亿次迭代,这仍然超过 60 年......
  • 你至少需要一个大型机来终止这个:-)

标签: java


【解决方案1】:

您的循环需要很长时间才能终止。

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

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

还请考虑您可能超出整数变量beyond its max value。 虽然这可能不会导致 Java 中的上溢或下溢,但它仍然可能导致意外行为,因为在整数变量达到 Integer.MAX_VALUE(即 2^32 - 1)之后,增量将使其值 Integer.MIN_VALUE等等。

在 int max value 超出上述情况的情况下,一些检查可能会失败:认为Integer.MAX_VALUE &gt; 1000,但Integer.MAX_VALUE + 1 会导致Integer.MIN_VALUE &lt; 1000

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

【讨论】:

  • 那么需要进行哪些调整?考虑到它基本上只包含 for 循环,我无法理解如何使这段代码更高效。
  • @JavaCoder Project Euler 挑战始终是关于理解基础数学而不是蛮力。事实上,它们是专门设计的,不能被暴力破解。
猜你喜欢
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 2011-10-24
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 2013-02-20
相关资源
最近更新 更多