【算法】素數專題
阿新 • • 發佈:2017-11-09
rim eve style log back rime logs als class
【素數判定】
假設輸入的都是正數,時間復雜度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; }
【算法】素數專題