素数高效算法之六倍数左右
算法简介
让我们来观察下列串自然数具有什么特征:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
通过观察6、12、18、24左右,存在素数但又不一定是素数。不难总结出除了2、3以外的所有素数都存在6倍数的那个数的左右,但是6倍数左右的数却不一定是素数。
由此我们可以以上一道例题为例,仅判断部分数字即可得出答案。
理论存在,安排!!
上代码
#include <iostream>
#include <math.h>
using namespace std;
int fun(int x) {
if(x == 2 || x == 3) return 1;
if(x % 6 != 1 && x % 6 != 5) return 0;
for(int i = 5; i <= sqrt(x); i += 6) {
if(x % i == 0 || x % (i+2) == 0) return 0;
}
return 1;
}
int main() {
int n;
while(cin >> n) {
cout << fun(n) << endl;
}
return 0;
}
相比于用定义的算法稍微要节省一些算力,如果想进阶学习素数判断的算法,建议去了解埃氏筛和欧拉筛
欢迎各位大佬指正