boolis_prime(int n){ // 如果 n < 2 则肯定不为质数 if( n < 2 ) returnfalse; for(int i = 2 ; i < n ; i++){ // 任何一个数 i 能整除 n,说明 n 不是质数 if( n % i == 0) returnfalse; } returntrue; }
方法 2:优化后
性质:如果 d 能整除 n , 那么 n/d 也能整除 n。(即 n 的约数都是成对出现的,例如,2 能整除 12,6 也能整除 12 )。
#include<iostream> #include<algorithm> usingnamespace std; voiddivide(int x){ for (int i = 2; i <= x / i; i ++ ) if (x % i == 0) { int s = 0; while (x % i == 0) x /= i, s ++ ; cout << i << ' ' << s << endl; } if (x > 1) cout << x << ' ' << 1 << endl; cout << endl; } intmain(){ int count; cin >> count; while(count--){ int n; cin >> n; divide(n); } return0; }
3. 质数筛选
参考:质数其实没有那么多。100 万以内,大概有 8 万个质数。
方法 1:
这种筛选方法的时间复杂度为:nlogn
#include<iostream> #include<algorithm> usingnamespace std; constint N = 1000010; int primes[N] , cnt ; bool st[N];
voidget_primes(int n){ for(int i = 2 ; i <= n ; i++ ){ // 如果这个数已经被筛过了,那么留下的数是一个质数,直接就存到 primes 数组中 if(!st[i]){ // 把这个质数存进 primes 数组中 primes[ cnt ++ ] = i ; } // j 从 2i 开始循环,查看i的倍数,给它赋值为true,标记他不是一个质数 for(int j = i + i ; j <= n ; j += i) st[j] = true; } }
intmain(){ int n; cin >> n ; get_primes(n); cout << cnt << endl; return0; }
方法 2:埃氏筛法
质数定理:1 ~ n 中,有lnnn 个质数。
这个方法中的时间复杂度约为 nloglogn ,基本上和 O(n) 复杂度是一个级别的。
这个算法也称为 埃氏筛法。
#include<iostream> #include<algorithm> usingnamespace std; constint N = 1000010; int primes[N] , cnt ; bool st[N];