zoukankan      html  css  js  c++  java
  • 素数表的获取以及对整数进行质因子分解

    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;
        }
    }
  • 相关阅读:
    android apk 防止反编译技术第二篇-运行时修改字节码
    android apk 防止反编译技术第一篇-加壳技术
    chromium浏览器开发系列第五篇:Debugging with WinDBG
    你所不知道的html5与html中的那些事(五)——web图像
    你所不知道的html5与html中的那些事(四)——文本标签
    无法导入以下密钥文件: xxxx.pfx,该密钥文件可能受密码保护 的解决方案
    GCD & LCM的一些性质
    HDU
    next
    树形结构与成环图的一个区别
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/10424520.html
Copyright © 2011-2022 走看看