Project Euler exists to encourage, challenge, and develop the skills and enjoyment of anyone with an interest in the fascinating world of mathematics.
欧拉计划(Project Euler)是一个在线解题网站,或者通俗的说是一个是刷题网站,但是相比于力扣先程序员常用的刷题网站,欧拉计划中的题目数学味要更浓,通常需要结合一定的数学与编程知识,写出适当的程序来求解问题。
就我个人的经历,欧拉计划是一个锻炼个人算法技能与数学知识的绝佳工具,在解决问题的过程中,你不仅可以了解一些以前不甚了了的数学知识,更可以将这种数学知识与算法设计结合起来,从而得到不断优化的算法。
正因为网站上的很多题目需要你花大量的时间来查询文献、学习新的数学知识并编写代码来求解,解答出一道难题通常会给你带来更强烈的满足感,就像很多人常说的,欧拉计划会让人刷题上瘾。
欧拉计划更加适合那些对数学感兴趣,尤其是对用编程来解决数学问题感兴趣的同学。就涉及的数学知识而言,欧拉计划中的大部分题目都与数论有关,所有了解一些常用的初等数论知识,如整除性质、数论函数、丢番图方程等等对解答题目会很有帮助。
欧拉计划不适合用来做准备程序员面试的刷题练习,因为欧拉计划中题目的难度通常比力扣等刷题网站中的题目要难得多,刷题非常浪费时间。其次,欧拉计划中的题目过于注重数学知识背景,而相对弱化了对编程技巧的训练,和一般公司的招聘要求是背道而驰的。
在编程语言方面,欧拉计划没有任何限制,解题时不需要提交代码,只需要提交最终结果就可以了,部分题目甚至可以使用数学技巧直接笔算解决。根据网站的提示,大部分问题应能在普通电脑上在一分钟内得到答案,如果代码的运行时间超过一分钟,则说明你的代码或者算法需要优化。
在进入欧拉计划网站后,我们可以点击上方的Archives栏查看所有题目,在下面的列表中一页会显示五十个题目,我们可以点击列表上方或下方的序号进行翻页,或者输入题号直接到达某个题目。
我们可以根据题目的序号(ID)、已解答的人数(Solved By)和难度系数(Difficulty)来对所有题目进行降序或升序排列。一般而言,我们可以根据已解答人数降序排列,这样可以更容易解决的题目会排在前面。其次我们可以根据难度系数选择题目,难度系数低的题目要比难度系数高的题目更易解决,但这个指标的可参考性不如已解答人数指标。
我们可以点击Progress栏查看我们的解题进度,包括已经解答出的题目、现在的等级、所获的奖章、发表的文章以及解题的时间线。当我们解答出题目后,可以点击对应这个问题的论坛,查看其它人是如何解决这个问题的。
相对于力扣等刷题网站,欧拉计划的国内的知名度相对较低,一方面可能是因为定位比较小众,另一方面则是因为本土化不够,网站题目是英文,论坛上的讨论是英文,相关的参考文章也基本都是英文,对于英文不好的同学可能接受起来比较困难。
我建立欧拉计划中文站,一方面是经常觉得欧拉计划上的题目设计的非常巧妙,解题过程让我充满收获,值得翻译成中文和更多人分享;另一方面,也是对我自己的解题历程、思路和代码做一些记录并与大家交流,如能启发出更好的思路和代码,则更感欣慰。
在每篇文章中,我首先将题目翻译成了中文,然后给出了我的解题思路和对应的代码,代码也可以在本仓库中找到。如果对题目翻译、解题思路以及代码有疑惑或者需要指出其中的错误的,可以在仓库中发出issue,我会尽量积极回复。
我在2017年7月20日做出了第一道题,这几年来在工作之余断断续续做出了接近一百多道题目,进度相对比较缓慢。我自身也不太注重刷题的速度,我希望能够对每道题给出最优的解法,不仅效率较高,同时代码结构也能比较优雅。在解题后,我会对解题思路做一个详细的描述,希望阅读的人能够很快的理解我的思路。关于我的解题进度,这幅图片会及时更新:
我的主力编程语言是python,而这也是欧拉工程解题语言中最常用的语言之一。python由于其优秀的设计,以及诸如列表推导式,lambda表达式等可口的语法糖,众多易用的外部库,通常只需要很少数量的代码,就可以很优雅的解决一些复杂的问题。如果可能,将来我还会尝试用其它语言,比如说julia,Haskell来解答题目。