#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline bool prime(int n){
if(n==1)return false;
if(n==2||n==3)return true; //(可以去了解一下孪生素数)
if(n%6!=1&&n%6!=5)return false; //大于等于5的素数一定在6*x左右两边,如果不在
for(int i=5;i*i<=n;i+=6) //就一定不是素数。 但即使在也有可能不是素数
if(n%i==0||n%(i+2)==0)return false; //在这里判断,步长设为6.
return true;
}
int main (){
int n;
cin>>n;
cout<<prime(n);
return 0;
}
一、大于等于5的素数可以设为 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1...
6x,6x+2,6x+3,6x+4显然都不是素数。
二、但即使是在6的左右两边也可能不是素数 如187 %6==1,
187是 11的倍数(187=11*17)
证明: 6x-1,6x+1不是2 也不是3的倍数, 因为6x-1=2*(3x)-1=3*(2x)-1
但合数一定能被拆分为若干个素数的乘积, 即6y-1,6y+1的乘积