1. 判断一个数n是不是质数
检查n能否被 [2, floor(sqrt(n))]
整除,若都不行,则是质数。
bool isPrime(int n){
if(n<=1) return false;
int sqr = int(sqrt(n*1.0));
for(int i=2; i<=sqr; i++){
if(n%i==0) return false;
}
return true;
}
2. 获取100以内的质数表
Eratosthenes筛法。
const int maxn = 100;
vector<int> primes;
bool deleted[maxn+1] = {
};
void findPrimes(){
for(int i=2; i<=maxn; i++){
//already know that 2 is a prime
if(!deleted[i]){
//i is a prime
primes.emplace_back(i);
for(int j=i+i; j<=maxn; j+=i) deleted[j] = true;
}
}
return;
}
3. 正整数n分解质因子
枚举 [2, floor(sqrt(n))]
的所有质数x,判断其是否是n的因子。用x除n,直到除不尽,就得到了这个因子的个数。
若最终n不能等于1,即不能被根号n以内的质因子除尽,则存在大于根号n 的质因子。
//已得到质数表primes
struct factor{
int num, pow;
factor(int x){
num = x;
pow = 0;
}
};
vector<factor> fac;
void findFac(int n){
int sqr = int(sqrt(n*1.0));
for(int x:primes){
if(x>sqr) break;
if(n%x==0){
factor temp(x);
while(n%x==0){
temp.pow++;
n /= x;
}
fac.emplace_back(temp);
}
}
if(n!=1){
factor temp(n);
temp.pow = 1;
fac.emplace_back(temp);
}
return;
}
4. n!分解质因子
[2, n]
内的质数,显然都是 n! 的质因子。- n! 的所有质因子一定在
[2, n]
内。 - 已知质数 p 属于
[2, n]
,那么 p 一定是一个质因子,如何求其个数。
6! = 1 * 2 * 3 * 4 * 5 * 6 = 2^4 * 3^2 * 5^1
p=2 =2*1 =2*2 =2*3 共4个2
p=3 =3*1 =3*2 共2个3
p=5 =5*1 共1个5
公式:
质 数 p 的 个 数 = ∑ r = 1 ∞ ⌊ n p r ⌋ 质数p的个数 = \sum_{r=1}^{\infty} \lfloor \frac{n}{p^r} \rfloor 质数p的个数=r=1∑∞⌊prn⌋
代码:
//已得到质数表primes
struct factor{
int num, pow;
factor(int x){
num = x;
pow = 0;
}
};
vector<factor> fac;
void findFac_factorial(int n){
for(int x:primes){
if(x>n) break;
factor temp(x);
temp.pow = getPow(n, x);
fac.emplace_back(temp);
}
return;
}
int getPow(int n, int p){
int ans = 0;
while(n>0){
n /= p;
ans += n;
}
return ans;
}