素数求法

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

1,试除法

直接按照定义:

void getprime(int x)

{

    for(int i=2;i<x;i++)

        if(x%i==0) return false;

    return true;

}

我们明显可以看出上面的这种方式有很多多余的判断,我们知道素数一定是奇数,所以只需要判断奇数是否能整除x就行了,为什么?因为奇数一定不能整除偶数。

void getprime(int x)

{

    if(x%2==0&&x!=2) return false;

    for(int i=3;i<x;i+=2)

        if(x%i==0) return false;

    return true;

}

是的,这中间还是有多余的判断,例如,100的因数有:11002504255201010,我们可以看出因子都是成对出现的,其中2-sqrt(n)中间因子的数量为总因子数量的一半,也就是说只需要判断2-sqrt(n)中有没有x的因子就行了,如果2-sqrt(n)没有x的因子则2-n-1也没有。

void getprime(int x)

{

    if(x%2==0&&x!=2) return false;

    for(int i=3;i<=(int)sqrt(x);i+=2)

        if(x%i==0) return false;

    return true;

}

当然仍旧还是没完,我们看这个,判断101是否为素数,则整除的对象有:3,5,7,9我们看出如果x不能整除3x一定也不能整除99是一个多余的判断,我们会发现被除数只需要是小于sqrt(x)的素数就行。

void getprime(int x)

{

    for(inti=0;i<num&&prime[i]<=(int)sqrt(x);i++)

    {

        if(x%prime[i]==0) return false;

    }

    prime[num++]=x;

    return true;

}

 

2,筛选法求素数

首先,2是公认最小的质数,所以,先把所有2的倍数去掉;然后剩下的那些大于2的数里面,最小的是3,所以3也是质数;然后把所有3的倍数都去掉,剩下的那些大于3的数里面,最小的是5,所以5也是质数......

上述过程不断重复,就可以把某个范围内的合数全都除去(就像被筛子筛掉一样),剩下的就是质数了。

void getprime()

{

    fill(p,p+N,1);

    for(int i=2;i<N;i++)

    {

        if(p[i])

        {

            for(int j=i+i;j<N;j+=i)

                p[i]=0;

        }

}

cnt=0;

for(int i=2;i<N;i++)

{

   if(p[i])prime[cnt++]=i;

}

}

上面这个代码同样可以改进,在求解的同时记录素数

void getprime()

{

    fill(p,p+N,1);

       cnt=0;

       for(int i=2;i<N;i++)

       {

              if(p[i]) prime[cnt++]=i;

              for(int j=0;j<cnt&&prime[j]*i<N;j++)

              {

                     p[prime[j]*i]=0;

                     if(i%prime[j]==0) break;

              }

}

素数求解的一般方法就如上所述

在Python中,可以使用以下几种方法来求解质数: 1. 基本方法:遍历从2到n-1的所有数字,判断是否能整除n。如果存在能整除n的数字,则n不是质数;否则,n是质数。 ```python def is_prime(n): if n <= 1: return False for i in range(2, n): if n % i == 0: return False return True ``` 2. 优化方法:在基本方法的基础上,可以进行一些优化。例如,只需要遍历从2到sqrt(n)的数字即可,因为如果存在大于sqrt(n)的因子,那么一定存在小于sqrt(n)的因子。 ```python import math def is_prime(n): if n <= 1: return False for i in range(2, int(math.sqrt(n)) + 1): if n % i == 0: return False return True ``` 3. Sieve of Eratosthenes(埃拉托斯特尼筛法):该方法通过不断筛选出质数的倍数来找到所有质数。具体步骤如下: - 创建一个长度为n+1的布尔数组is_prime,并将所有元素初始化为True。 - 将is_prime和is_prime设置为False,因为0和1不是质数。 - 从2开始遍历到sqrt(n),对于每个素数p,将is_prime[p]设置为True,并将p的倍数is_prime[p*i](i从2开始)设置为False。 - 遍历is_prime数组,将为True的索引值添加到结果列表中。 ```python def sieve_of_eratosthenes(n): is_prime = [True] * (n + 1) is_prime[0] = is_prime[1] = False p = 2 while p * p <= n: if is_prime[p]: for i in range(p * p, n + 1, p): is_prime[i] = False p += 1 primes = [i for i in range(n + 1) if is_prime[i]] return primes ``` 这些是Python中常用的几种质数求解方法。你可以根据具体需求选择合适的方法来使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值