ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-05-29 23:03:38  阅读:170  来源: 互联网

标签:prime int 因子 整数 素数 maxn true


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;
    }
}

 

标签:prime,int,因子,整数,素数,maxn,true
来源: https://blog.51cto.com/u_14201949/2832073

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有