我的ProjectEuler实现太慢了

时间:2016-09-12 18:33:00

标签: python algorithm

这就是问题所在:

  

2520是可以除以1至10中的每个数字而没有任何余数的最小数字。   可以被1到20的所有数字整除的最小正数是多少?

这是我的解决方案,但需要花费很多时间!

x = 0
check = [11, 13, 14, 16, 17, 18, 19, 20]

while True:
    x += 1
    if all(x % j == 0 for j in check):
        print "The NUMBER is", x
        break
    print x

我怎么能改善它?柜台是主要问题吗?还是一会儿? 编辑:我已经看到有很多不同的解决方案,但我应该怎么做才能检查1中的每一个号码而没有像LCM这样的功能?

3 个答案:

答案 0 :(得分:0)

这是我对C ++程序的实现。

而不是number++,我选择number += 2,为什么?因为奇数不会被2整除,因此我的搜索空间从O(n)减少到O(n/2)。通过将代码转换为number += 20 (limit),还有一种方法可以减少空间搜索,因为我们知道多个20可以从数字1-20中分割出来(称之为高级数学:P)。

接下来,我开始从limit 20开始核对,因为%limit的失败更改比2, 3, 4, 5 etc. // smaller numbers更改失败。因此,减少一点计算时钟周期。

#include<fstream>
#include<iostream>
using namespace std;


int main ( ) {
    int limit = 20;

    bool found;
    int number = 2; // OR number = limit; 

    do { 
        found = true;
        for ( int i=limit; i<=1 && found; --i ) {
            if ( number%i != 0 ) found = false;
        }

        number += 2; // OR number += limit;
    } while ( !found );

    cout << "Smallest Number Divisible by all from 1 to " << limit << " is: " << number -= 2 /* OR number -= limit; since we added it one more time @the end */ << endl;
}

我希望这可以帮助你:)

答案 1 :(得分:-1)

你可能从2520开始节省一些时间。根据案文,没有更小的数字可以满足该标准。加上可以被数字1-20整除的任务,而不是11-20。

答案 2 :(得分:-1)

好的,谢谢大家的惊喜建议!我发现在我的情况下,问题是print x,这需要花费太多时间在终端上打印。 我的最终解决方案是:

x = 0
check = [11, 13, 14, 16, 17, 18, 19, 20]

for x in xrange(20, 500000000, 20):
    if all(x % j == 0 for j in check):
        print "The NUMBER is", x
        break

它更干净,它从20跳到40,依此类推,xrange比我读过的更快。