质数求法

    xiaoxiao2021-03-25  159

    质数(prime number)

    又称素数,有无限个。

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

    --摘自百度百科质数

    依照此定义我们知道质数有2,3,5,7,11,13……(附上1000以内的素数表)

    参考题目:UVA  543 - Goldbach's Conjecture

    UVA-543

    判断素数方法模板(参考):

    int isPrime(int n){ for(int i=2;i<=sqrt(n);i++){ if(n%i==0) return 0;//No } return 1;//Yes }

    函数参数 默认写int类型,若是超出了int 数值范围可修改之为 long(long),具体分析依据见 整型数值范围

    由于是C++,返回类型应该声明为布尔类型  bool 来判断,不过也可以用int,后者通过C和C++,但殊途同归。

    另一考点提示,求取某一区间范围内的素数个数,如何处理?如果对区间内单个数值调用函数 如isPrime(i)结果可以出来,但是一般都会超时不能AC,

    此时我们需优化代码,此处用到预处理的方法。

    参考题目:略

    代码示例:

    //1000000以内素数筛法(预处理) #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N=1000000; short t[N+3];//省点空间用short不用int int i,j,m,n; int main(){ //memset(t,1,sizeof(t)); fill(t,t+N,1); //memset和fill函数的区别,可以参考博文http://blog.csdn.net/liuchuo/article/details/52296646 for(i=2; i<=N; ++i){ if(t[i]){// 避免二次筛选,代码优化所在 for(j=2; j*i<=N; ++j) t[i*j]=0; } }// 此时已得出1000000以内素数,i、j的初值不影响t[2]、t[3] //for (i=2; i<=N; ++i)if(t[i]) {cout <<i <<" "; } while(cin>>m>>n){ if(!m && !n) break; for(i=m; i<=n; ++i) if(t[i]) printf("%d ",i); }return 0;}

    附图:  1000以内质数表

       

    可能有人看了代码以后会对预处理的原理不太清楚,其实就是利用数组的下标值(从0开始……)对应相应的整数,一开始整个数组都赋初值为true(本代码为1),接着再把非质数改为fals(此处为0)。哎,其实自己随便拿个数据小点的数组画一画、举个实例就能理解了。 }

    待更,持续更新中……17/07/2017

    转载请注明原文地址: https://ju.6miu.com/read-15942.html

    最新回复(0)