欧拉计划(Project Euler)是一个解题网站,站内提供了一系列数学题供用户解答,解题的用户主要是对数学和计算机编程感兴趣的成年人及学生。其主旨为鼓励、挑战和培养爱好数学的人的技能和乐趣。目前该站包含了七百多道不同难度的数学题。每一题都可以通过计算机程序在1分钟内求出结果。该网站自2001年起定期增加新的题目,每题都有对应的讨论区,只有注册用户在正确提交了这题的答案后才能进入。 网站设立了6个排行榜,其中的欧拉人(Eulerians)排行榜的分数需要最新题目的前50位解答者才能获得。欧拉计划不希望在站外分享题目的答案。
例题与解答
欧拉计划的第一题是:
列举出10以下所有3或5的倍数,我们得到 3, 5, 6 和 9。他们的和是23。
求1000以下所有3或5的倍数之和。
虽然这题比欧拉计划大多数题目要容易的多,我们仍然可以用它来分析不同解题方法的效率。
用 O\bigl(n\bigr) 的穷举法来测试1000以下的所有符合条件的自然数,再将它们相加就能得到这题的结果。这很容易实现,用以下两种不同的编程语言都能用很快求解出答案。
Python:
print(sum(i for i in range(1000) if i%3 == 0 or i%5 == 0))
C++:
#include
using namespace std;
int main( ) {
int sum = 0;
for (int i = 0; i
但如果用容斥原理进行求和,就可以减少1000多次运算,获得 O\bigl(1\bigr) 的时间复杂度。
: sum(n) = \sum_{i=1}^{\lfloor \frac{n}{3} \rfloor} 3i + \sum_{i=1}^{\lfloor \frac{n}{5} \rfloor} 5i - \sum_{i=1}^{\lfloor \frac{n}{15} \rfloor} 15i
: \sum_{i=1}^n ki = k\frac{(n)(n+1)}{2}
Python 实现:
def sum1toN(n):
return n * (n + 1) / 2
def sumMultiples(limit, a):
return sum1toN((limit - 1) / a) * a
sumMultiples(1000, 3) + sumMultiples(1000, 5) - sumMultiples(1000, 15)
采用这种方法,计算10,000,000以下或1000以下所花费的时间是相等的。
参考文献
外部链接
*[http://projecteuler.net/ 欧拉计划首页]
评论 (0)