质数(素数)

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=1prn
代码:

//已得到质数表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;
}

猜你喜欢

转载自blog.csdn.net/sinat_37517996/article/details/105346222
今日推荐