一些常用的求素数方法
思路一:2~sqrt(n)之间的数不能整除:
(用于应付学校作业)
#include <bits/stdc++.h>
using namespace std;
int is_prime(int x){
int flag=0;
if(x==0||x==1)return 0;
if(x==2||x==3)return 1;
for(int i=2;i<=sqrt(double(x));i++){
if(x%i==0){flag++;break;}
}
if(flag)return 0;
else return 1;
思路二:欧拉筛
(复杂度为O(n),效率更高)
#include <bits/stdc++.h>
using namespace std;
#define MAXX 100000005
bool A[MAXX] = { false }; long long int prime0[MAXX];
void is_prime(long long int x) {
long long int n = 0;
for (long long int i = 2; i <= x; i++) {
if (!A[i]) { prime0[n++] = i; }
for (long long int j = 0; j < n; j++) {
if (i * prime0[j] > x)break;
A[i * prime0[j]] = true;
if (i % prime0[j] == 0)break;
}
}
}
int main(){
int t;
long long int m;
cin >> t;
while (t--) {
cin >> m;
is_prime(m);
if (!A[m]) { printf("Yes\n"); }
else { printf("No\n"); }
}
return 0;
}
思路三:6倍法
(用于判断一个大数是否为素数)
#include <bits/stdc++.h>
using namespace std;
int is_prime2(long long int x) {
if (x == 0 || x == 1)return 0;
if (x == 2 || x == 3 || x == 5)return 1;
if (x % 2 == 0 || x % 3 == 0)return 0;
for (int i = 6; i <= sqrt(double(x)); i += 6) {
if (x % (i - 1) == 0 || x % (i + 1) == 0)return 0;
}
return 1;
}
int main(){
int t;
long long int m;
cin >> t;
while (t--) {
cin >> m;
if (is_prime2(m)) { printf("Yes\n"); }
else { printf("No\n"); }
}
return 0;
}