一,前言
目前求质数的方法多种多样,下面就介绍两种方法求质数。
二,线性筛法生成质数
筛法生成小于或等于n的质数的原理就是,将0到n的所有自然数都存放进一个数组里面。然后从2开始循环直到n,循环到i时,就把i的所有倍数(小于或等于n)都从这个数组里面移除,最后剩下的就是小于或者等于n的质数。
但是这种方法有一定的缺陷,就是假设 i 和 j 都是max的因数,那么无论是循环到i还是j,程序都会将max从数组中抹去,这样就重复计算了。为了消除这种不必要的计算,我们可以选用线性筛法来提高速度。
线性筛法生成质数的原理如下(结合下面的代码来理解可以更顺畅):
整个事件简单来说就是,从2到n按顺序依次抽出一个数(设为i),然后找出所有的i*m,把i*m从数组里面筛掉(因为它是合数),其中,m的取值是不小于2且不大于“i的最小质因数”的全体质数。那么数组中剩下的就全是质数了。这就是实现每个合数都只被划去一次(被它们的最小质因数筛掉)的过程。详细代码解说如下:
若要生成小于或者等于n的所有质数,则设置两个数组is_prime和prime,它们的大小均为n+1。将数组is_prime中的所有元素均初始化为0。is_prime[i]等于0时,代表i是质数;当is_prime[i]等于1时,代表i是合数。prime[i]从2到n的第i+1个质数。再设置一个下标now,它代表当程序运行到当前状态时,prime[now-1]是prime数组中的最后一个质数。
然后循环变量i,从2到n。当循环到h时,如果h是质数,那么就将h加入prime数组中,并将下标now的值加一,然后向下继续执行。如果h是合数,那就直接向下执行。
这时候,循环j,从0到now-1,而prime[now-1]*h必定是一个合数,仅当它小于或等于n时,循环j继续。如果说,prime[j]是h的因数,那么将prime[j]*h从数组里面删掉,然后退出循环。这是因为如果prime[j]是h的因数的话,那么prime[j]*h的最小

本文介绍了一种高效的线性筛法生成小于或等于n的所有质数的方法。通过优化传统筛法,避免了重复计算,提高了求质数的速度。
最低0.47元/天 解锁文章
591

被折叠的 条评论
为什么被折叠?



