这就是问题所在:
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这样的功能?
答案 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比我读过的更快。