素数的求解

原创 2016年08月28日 16:07:34

素数的定义

定义:在一个大于0的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。

思路<1> 试除法

思路<2> 试除法 + 抛去偶数

思路<3> 试除法 + 抛去偶数 + 缩小试除范围

思路<4> 对素数试除法 + 减少扫描区间

————————————
思路(3) 试除法 + 抛去偶数 + 缩小试除范围

具体思路:思路 1和思路 2的试除范围都在[2,n - 1],其实范围可以限制在[2,sqrt[n]],因为如果一个数不是素数,那么它肯定有至少有俩因子,而且因子也是成对出现的,而且一个因子是大于sqrt[n]的,一个因子是小于sqrt[n]的。

代码:

///试除法 + 刨除偶数 + 减少扫描区间  
bool IsPrime(int nNum)  
{  
    if (nNum == 2)  
    {  
        return true;  
    }  
    if ((nNum & 1) == 0)//刨除偶数  
    {  
        return false;  
    }  
    for (int i = 3;i * i <= nNum;i += 2)  
    {  
        if (nNum % i == 0)  
        {  
            return false;  
        }  
    }  
    return true;  
}  

在单独处理偶数时,这里使用位操作进行做的,效率比取余操作高。

————————————–
思路(4) 对素数试除法 + 减少扫描区间
分析:
(1)合数(不是素数就是合数)是由若干个质数相乘而得来的,比如,合数6是有素数2和3相乘得到。15是由素数3和5相乘得到。
(2)前几个思路使用试除法时,也对合数进行了取余,所以造成浪费。比如判断103是否为素数时,如果采用试除法 + 抛去偶数 + 缩小试除范围的方法,则需要取余的整数为2,3,5,7,9,10。我们可以观察3和9,如果一个数N能被9整除,那么它肯定能被3整除。反过来说,如果N不能被3整除,则肯定不能被9整除。因此我们只需要检查3即可。对于10也是,如果N不能被2和5整除,它肯定也不能被10整除。

因此,我们要判断数N是否是素数时,只需要对[1,sqrt(N)]之间的素数进行试除即可。

注意,这里的前提是我们已知[1,sqrt(N)]之间的素数。

代码:假设我们已经知道素数集合nArrPrimeTable中,素数个数为nCount个。

//对素数试除法 + 减少扫描区间  
bool IsPrime(int nNum)  
{  
    if (nNum == 2)  
    {  
        return true;  
    }  
    for (int i = 0;i < nCount && nArrPrimeTable[i] * nArrPrimeTable[i] <= nNum;i++)  
    {  
        if (nNum % nArrPrimeTable[i] == 0)  
        {  
            return false;  
        }  
    }  
    return true;  
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

POJ 2262 Goldbach's Conjecture (求解素数的一般筛和线性筛)

POJ 2262 Goldbach's Conjecture (求解素数的一般筛和线性筛)

素数的求解问题

  • 2016年05月26日 08:53
  • 2KB
  • 下载

C语言求解素数

  • 2015年06月08日 23:42
  • 160B
  • 下载

求解范围内素数

1、素数的定义 素数,又称质数,在一个大于1的自然数中,除了1和此整数自身之外,不能被其他自然数整除的数。1和0不是素数。 范围素数的判断方法这里提供了两种,一种是试除法,一种是Eratosthe...

算法中的素数求解

  • 2013年12月05日 06:57
  • 16KB
  • 下载

do while循环求解素数

  • 2014年04月30日 16:32
  • 123B
  • 下载

poj 2417 Discrete Logging 求解模方程a^x=b(mod n),n为素数+模板题(baby_step giant_step)

#include #include #include #include #include #include using namespace std; #define LL long lon...

素数判定与线性方程求解

  • 2009年04月19日 17:02
  • 21KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:素数的求解
举报原因:
原因补充:

(最多只允许输入30个字)