Project Euler上有很多有意思的问题,刚做到第27题,对这个问题做个小结。
Problem 27:
Euler有一个著名的方程n^2+n+41,当n=0到39时,方程结果均为质数。如今人们用电脑计算,发现了另一个方程n^2-79n+1601,当n=0到79时,方程结果也均为质数。
设一方程形如n^2+an+b,其中|a|<1000,|b|<1000,n为从0开始的连续自然数。
求使得公式能获得最多质数的a和b,输出结果为a*b。
问题很简单,首先写好判断质数的方法:
bool isPrime(int Num)
{
for(unsigned long int n=2; n<=sqrt(Num);n++)
{
if(Num%n == 0)
{
return false;
}
}
return true;
}
然后直接穷举遍历,搜索符合条件的a和b,写出程序第一版:
void Euler_Cal_27()
{
int n=0;
int maxn = 0;
int expr = 0;
int result = 0;
for(int a=-999; a<1000; a++)
{
for(int b=-999; b<1000; b++)
{
n = 0;
expr = n*n + a*n + b;
while(isPrime(expr) &&expr>0)
{
n++;
expr = n*n + a*n + b;
}
if( n>maxn )
{
maxn = n;
result = a*b;
}
}
}
}
cout<< result <<endl;
}
电脑CPU是E6600,得到正确结果用时1.4s。虽然用时不长,但是搜索范围很小,所以肯定有提高的余地。优化自然先从循环着手,仔细检查一下发现while循环条件顺序有误。&&运算只要前一个条件为假就不进行后面条件的判断,而这里恰恰将判断质数放在判断正负这种简单运算前面,影响速度。所以调换条件顺序,此时程序运行时间减少至0.3s。又看了一会儿之后再没想到其他优化方法,所以上论坛看看其他人是如何解决的。一看果然有收获。
1、 n须从0开始,所以当n=0时,方程结果必为质数,否则此时的a和b肯定不是最优结果。而n=0时,方程结果是b,所以b必须为质数。
2、 当n=1时,方程结果为1+a+b,质数必须大于0,所以有a>-b-1。即确定b后,可以缩小a的搜索范围。
还有人事先生成质数表,通过查表来判断质数,减少运行时间。但是这种方法在改变搜索范围时需要重新生成质数表,有些麻烦,所以没有使用。仅依照以上提到的两个条件进行优化,第二版代码如下:
voidEuler_Cal_27()
{
int n=0;
int maxn = 0;
int expr = 0;
int result = 0;
for(int b=1; b<1000; b++)
{
if(isPrime(b))
{
for(int a=-b; a<1000; a++)
{
n = 0;
expr = n*n + a*n + b;
while( expr>0 && isPrime(expr) )
{
n++;
expr = n*n + a*n + b;
}
if( n>maxn )
{
maxn = n;
result = a*b;
}
}
}
}
cout<< result <<endl;
}
此时程序运行时间减少至0.17s。
从这次优化小程序发现,优化程序时大多从代码本身入手,忽略问题,不去想原理,在进一步提高程序性能的时候容易遇到瓶颈。以后要注重锻炼自己理解问题的能力,基础还是很差,需要提高。
分享到:
相关推荐
solution to problem 5
ProjectEuler题1-16题代码,直接引入Eclipse就可以用
project euler代码库1,已测试通过
NULL 博文链接:https://lifethinker.iteye.com/blog/290159
NULL 博文链接:https://linuke.iteye.com/blog/1056283
Project Euler solutions in assembler.
NULL 博文链接:https://lampeter123.iteye.com/blog/423036
欧拉计划projecteuler.net
projecteuler.net 我对 Project Euler 问题的一些解决方案: :
project euler代码库第二部分(已测试通过
project euler代码库第三部分(已测试通过
project euler代码库第五部分(已测试通过
项目欧拉解决方案该存储库包含我对 Project Euler (projecteuler.net) 上发现的编程问题的所有答案。 每个解决方案都是用 Java 编写的,旨在从命令行运行。 解决方案文件中将提供指向相关欧拉问题的链接。 某些解决...
project_euler Project Euler 问题的解决方案 ###Problem 1 - 3 和 5 的倍数### 如果我们列出所有 10 以下是 3 或 5 的倍数的自然数,我们得到 3、5、6 和 9。这些倍数的和是 23。求1000 以下所有 3 或 5 的倍数之...
ProjectEulerQuestions projecteuler.net 上问题的解决方案
project-euler:多种语言的projecteuler.net问题解决方案
Algorithm-hacktoberfest-projecteuler.zip,此repo包含多种语言的projecteuler问题的解决方案。为新来者特别设计,作为黑客节挑战的一部分。,算法是为计算机程序高效、彻底地完成任务而创建的一组详细的准则。
投影仪Project Euler 问题的解决方案,请参阅地位# 名称秒1 3 和 5 的倍数0.02 甚至斐波那契数列0.03 最大素因数0.94 最大的回文产品0.15 最小倍数2.56 和平方差0.07 第 10001 个素数0.1解决方案8 系列中最大的产品...
Project-Euler 我使用 C++ 解决 Project Euler 问题 摘自网站: “欧拉计划是一系列具有挑战性的数学/计算机编程问题,需要的不仅仅是数学洞察力来解决。虽然数学可以帮助你找到优雅有效的方法,但解决大多数问题...
ProjectEuler + 我在Java中(仅Java)对HackerRank的解决方案。 有关更多详细信息,请。 相信我,不是一个奇怪的网站。 ##为什么要用Java? 很好的问题。 会的,如果您是在C ++中使用“ unsigned int / long”的,...