素数的求解

原创 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;  
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Java队列递归求解素数环问题

思路: 1.创建顺序表SqList的对象L,用于存放素数环中的数据元素; 创建链队列LinkQueue对象Q,用于存放还未加入到素数环中的元素。 2.初始化顺序表L和队列Q:将1加入到顺序表L中,...
  • dly215011
  • dly215011
  • 2016年10月31日 19:16
  • 680

A1034. 孪生素数对

问题描述   差为2的两个素数被称为孪生素数对,例如3和5, 11和13.   给定一个区间,请输出区间内所有的孪生素数对. 输入格式   两个正整数a,b,其中a 输出格式...
  • qq_36238595
  • qq_36238595
  • 2016年12月31日 13:06
  • 313

机试算法讲解: 第44题 深度优先搜索之素数环问题

/* 问题:在给定的1到n的数字中,将数字填入环中,使得环中任意2个相邻的数字和为素数。按字典序输出所有符合条件的解 回溯法:枚举每一个值,第一个放1时,尝试放入第二个数字,使其和1的和为素数,放入后...
  • qingyuanluofeng
  • qingyuanluofeng
  • 2015年08月01日 14:42
  • 574

关于素数的求解

素数即只能被1和其本身整除的数,判断n是否为素数只需用2~n/2或2~n之间的数去除就可以了,常用2~n/2,因为一个数的一半的平方大于其本身是从5开始的,解方程:n/2的平方>n 。即一个数n的两个...
  • zpwangshisuifeng
  • zpwangshisuifeng
  • 2017年01月17日 14:10
  • 148

【算法】寻找1000000000(十亿)内素数并统计个数

已优化到 22 秒内,不知道世界最快算法在同样环境下运行速度是多少,下面贴出代码,C# using System; namespace prime { class Program ...
  • for_cxc
  • for_cxc
  • 2016年07月06日 14:50
  • 1152

C语言求给定范围内的所有素数

问题描述 求给定范围start〜end之间的所有素数。 问题分析 判定一个整数m是否为素数的关键就是要判定整数m能否被除1和它自身以外的任何其他整数所整除,若都不能整除,则m即为素数。 ...
  • qq_35038153
  • qq_35038153
  • 2017年04月28日 12:53
  • 1471

【随机化算法】蒙特卡罗算法,主元素问题,素数测试问题

0049算法笔记——【随机化算法】蒙特卡罗算法,主元素问题,素数测试问题 分类: 算法2013-07-05 13:59 215人阅读 评论(0) 收藏 举报 蒙特卡罗算法主元素问题...
  • pi9nc
  • pi9nc
  • 2013年08月03日 21:13
  • 2301

51Nod 1135-原根(快速求解一个素数的原根)

题目地址:51Nod 1135 1.原根定义:设m>1,gcd(a,m)=1,使得成立的最小的r,称为a对模m的阶。 2.定理:如果模m有原根,那么他一共有个原根。 3.定理:如果p为素数,那么...
  • u013486414
  • u013486414
  • 2015年08月19日 15:51
  • 1890

求一千万以内的素数的个数

利用筛法计算小于n的素数的个数,利用bit作为标志位,只设置奇数的标志位,不设置偶数的标志位,这样可以使内存降为原来的1/16...
  • crazywang66
  • crazywang66
  • 2016年04月21日 23:09
  • 729

求解1-n之间的素数

1、简陋的算法: void prime(int n) { for (int i = 2; i < n; ++i) { int j; for (j = 2; j sqrt(i)) ...
  • left_la
  • left_la
  • 2013年04月16日 09:18
  • 3817
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:素数的求解
举报原因:
原因补充:

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