欧拉计划系列问题将会有效的提升你的解题思维、编码能力,帮助你掌握基本公式、基本原理,学会如何运用。不要通过暴力求解来完成;也不要没经过自己分析就查看提示。在这里你将学到一些有趣的东西,它们要比你之前学的深入一些,例如:利用除了2、3以外的质数它们都可以表示成6×k±1的形式这一特点,可以将单个素数判断优化到耗时只有1/5左右:
#include<bits/stdc++.h>
using namespace std;
bool ss1(int n){
if(n<=1)return false;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0) return false;
}
return true;
}
bool ss(int n){
if(n<=3)return n>1;
//6(x+1)-1=6x+5
if((n%6!=1)&&(n%6!=5)) return false;
int mx=sqrt(n);
//6x-1遍历一次,6x+1遍历一次,所以
//遍历全部素数需要两次:i=5和i=7
for(int i=5;i<=mx;i+=6){
if(n%i==0||n%(i+2)==0)return false;
}
return true;
}
int main(){
long long k=1e6,t=clock();
for(int i=2;i<=k;i++){
ss1(i);
}
cout<<clock()-t<<endl;
t=clock();
for(int i=2;i<=k;i++){
ss(i);
}
cout<<clock()-t;
return 0;
}
通常情况下,这些题目只需要你输出结果,但你应该提交你的代码来检测它的效率如何。
通常情况下,这些题目会有若干个不同的输入,每个输入对应一个测试点,其中第一个测试点是原题的数据。
通常情况下,朴素算法可以通过第一个测试点,但后面的若干测试点是无法通过的。
例如第一题(3或5的倍数)会有两个测试点,其中第一个为n=1000,第二个为n=1000000,第三个为n=1000000000。