【算法】素数专题
【素數判定】
假設輸入的都是正數,時間復雜度O(sqrt(n))
bool is_prime(int n){for(int i = 2;i*i <= n; i++){if(n % i == 0) return false;}return n != 1; }【因數枚舉】
時間復雜度O(sqrt(n)).
vector<int> divisor(int n){vector<int> res;for(int i = 1;i*i <= n; i++){if(n % i == 0){res.push_back(i);if(i != n/i) res.push_back(n / i);}} }【質因數分解】
時間復雜度O(sqrt(n))
map<int, int> prime_factor(int n){map<int, int> res;for(int i = 2;i * i <= n; i++){while(n % i == 0){++res[i];n /= i;}}if(n != 1) res[n] = 1;return res; }【n以內的素數】
埃氏篩法,時間復雜度O(log(log(n))),近似于O(n)。
//求n以內的素數 const int n = 10000; int prime[n]; //素數數組,prime[i]表示第i個素數 bool is_prime[n+1]; //is_prime[i]為true表示i是素數//返回n以內素數的個數 int sieve(int n){int p = 0;for(int i = 0;i <= n; i++) is_prime[i] = true;is_prime[0] = is_prime[1] = false;for(int i = 2;i <= n; i++){if(is_prime[i]){prime[p++] = i;for(int j = 2*i; j <= n; j += i) is_prime[j] = false; }}return p; }總結
- 上一篇: 【算法】Kruskal算法(解决最小生成
- 下一篇: 【算法】单源最短路径和任意两点最短路径总