素数表的获取以及对整数进行质因子分解

1.  求(0 - maxn)之间所有素数构成的素数表

法一:判断每个数是否为素数,如果是素数存入素数表, 算法复杂度为O(n根号n)

代码:

// 判断整数n是否为素数, 是素数则返回true
bool isPrime(int n){
    if (n <= 1)
        return false;
    int sqr = (int)sqrt(1.0 * n);
    for (int i = 2; i <= sqr; i++){
        if (n % i == 0){
            return false;
        }
    }
    return true;
}
// 求素数
const int maxn = 100;
int prime[101];            // 存储所有的素数
int pnum = 0;            // 素数的个数
bool p[101] = { 0 };    // 判断每个下标对应的数是否为数数的结果
void find_prime(){
    for (int i = 0; i < maxn; i++){
        if (isPrime(i)){
            prime[pnum++] = i;
            p[i] = true;
        }
        else{
            p[i] = false;
        }
    }
}

法二:素数筛选法,复杂度O(nloglogn),优点:算法复杂度低,代码简短

代码:

// 素数筛选法求素数表
const int maxn = 101;        // 表长
int prime[maxn], pNum = 0;    // prime数组存放所有素数,pNUM为素数个数
bool P[maxn] = { false };        // 如果i为素数,则P[i]为false,否则P[i]为true
void Find_Prime(){
    for (int i = 2; i < maxn; i++){
        if (P[i] == false){            // 如果i是素数
            prime[pNum++] = i;
            for (int j = i + i; j < maxn; j += i){
                // 把所有i的倍数都设为为合数,即把P[j] 置位true
                P[j] = true;
            }
        }
    }
}

2. 对整数n进行质因子分解

将质因子以及每个质因子的数量存入一个结构体中,遍历上面求出的素数表,遍历范围只需是(2 - sqrt(n)),因为n的质因子一定小于等于sqrt(n), 当然还有一个特例就是n本身,通过遍历素数表,求出所有的质因子及对应的数量。

质因子结构体和实现函数:

// 存储质因子的结构体
struct factor{
    int x, cnt;        // x为质因子,cnt为其个数
}fac[10];
// 求数n的质因子
int num = 0;
void findFactors(int n){
    int sqr = (int)sqrt(1.0 * n);
    for (int i = 0; i < pNum && prime[i] <= sqr; i++){
        if (n % prime[i] == 0){
            fac[num].x = prime[i];
            fac[num].cnt = 0;
            while (n % prime[i] == 0){
                fac[num].cnt++;
                n /= prime[i];
            }
            num++;
        }
    }
    if (n != 1){            // 如果无法被根号n以内的质因子除尽
        fac[num].x = n;        // 那么一定有一个大于根号n的质因子
        fac[num++].cnt = 1;
    }
}
原文地址:https://www.cnblogs.com/hi3254014978/p/10424520.html