zoukankan      html  css  js  c++  java
  • 判断一个数是否为素数(质数)

    定义

    质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

    实现

    直观的方法

    int isprime(int x) {
        if (x < 2) return false; // 小于2的数都不是质数
        for (int i = 2; i < x; i++)
            if (x % i == 0) return false;
        return true;
    }
    

    显然这个算法的复杂度为(O(N))

    更快的方法

    我们知道,一个数如果可以进行因数分解,那么分解时得到的两个数一定是一个小于等于(sqrt(n)),一个大于等于(sqrt(n))。所以,循环没有必要从(2)(x-1),只需要从(2)(sqrt(n))就好了,那么这个算法的时间复杂度就为(Oleft(sqrt(n) ight))

    int isprime(int x) {
        if (x < 2) return false; // 小于2的数都不是质数
        for (int i = 2; i <= int(sqrt(x)); i++) // 从2到sqrt(x)
            if (x % i == 0) return false;
        return true;
    }
    

    当然,这个算法还可以继续优化,我们可以判断2是不是这个数的约数,然后就可以从(3)开始循环到(sqrt(n))了,每次循环(i+2),那么这个算法的复杂度就为(O(sqrt(n)/2))

    int isprime(int x) {
        if (x < 2) return false; // 小于2的数都不是质数
        if (x != 2 && x % 2 == 0) return false; // 不是2且能被2整除的数都不是质数
        for (int i = 3; i <= int(sqrt(x)); i += 2) // 每次循环加2
            if (x % i == 0) return false;
        return true;
    }
    

    还有更快的吗?——埃拉托斯特尼筛法

    即使是上述的算法,在遇到很大的数字((nge{100,000,000}))的时候,还是很慢。
    那还有没有更快的算法呢?答案是有的,埃拉托斯特尼筛法就是其中之一。

    我们可以把从(2)(maxn)的数储存为一张表,例如bool prime[MAXN];
    然后我们遍历这个数组,把(i)的倍数从数组中去掉,这样我们就得到了一张从(2)(maxn)的质数的表。
    需要判断一个数是否为质数的时候只需要查询这张表就可以了,例如if (prime[i]) // 你的操作

    void getPrime(int maxn) {
        for (int i = 0; i <= maxn; i++) prime[i] = 1; // 全部定义为质数 
        prime[0] = prime[1] = 0;
        for (int i = 2; i <= maxn; i++) {
            if (!prime[i]) continue;
            for (int j = i * 2; j <= maxn; j += i) prime[j] = 0; // i的倍数标记为合数 
        }
    }
    

    引用

    素数的四种判断方法、实现及比较:https://blog.csdn.net/zhanshen112/article/details/90574455

  • 相关阅读:
    hdoj 2803 The MAX【简单规律题】
    hdoj 2579 Dating with girls(2)【三重数组标记去重】
    hdoj 1495 非常可乐【bfs隐式图】
    poj 1149 PIGS【最大流经典建图】
    poj 3281 Dining【拆点网络流】
    hdoj 3572 Task Schedule【建立超级源点超级汇点】
    hdoj 1532 Drainage Ditches【最大流模板题】
    poj 1459 Power Network【建立超级源点,超级汇点】
    hdoj 3861 The King’s Problem【强连通缩点建图&&最小路径覆盖】
    hdoj 1012 u Calculate e
  • 原文地址:https://www.cnblogs.com/luoling8192/p/12842059.html
Copyright © 2011-2022 走看看