版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_43412506/article/details/86737669
素数的求解在很多题目当中都会用到,最常见的就是直接暴力判断
bool isprime(int number) { if(number==1) return 0; if(number==2) return 1; for(int i=2;i*i<=number;i++) { if(number%i==0) return 0; } return 1; }
但是这种方法是一种糟糕的方法,它的耗时是巨大的,所以我们需要寻找更好的方法来解决这个问题
我们知道,最大公约数只有1和它本身的数叫做素数,那么只要剔除2 3 4 5 6...的倍数,得到的数就是素数
代码:
const int maxn = 1e6+5; int p[maxn]; void isprime() { memset(p,0,sizeof(p)); for(int i = 2;i*i<maxn;i++) { if(p[i]==0) { for(int j = i*2;j<maxn;j+=i) p[j] = 1; } } }
除了剔除2,3,4,5,6..的倍数,还有两种方法筛选素数,具体参考三种素数筛选法详解
相关知识:
1.最大公约数只有1和它本身的数叫做质数(素数)
2.高斯猜测,n以内的素数个数大约与n/ln(n)相当,或者说,当n很大时,两者数量级相同。这就是著名的素数定理。
3.十七世纪费马猜测,2的2^n次方+1,n=0,1,2…时是素数,这样的数叫费马素数,可惜当n=5时,2^32+1就不是素数,
4.18世纪发现的最大素数是2^31-1,19世纪发现的最大素数是2^127-1,20世纪末人类已知的最大素数是2^859433-1,用十进制表示,这是一个258715位的数字。
5.孪生素数猜想:差为2的素数有无穷多对。目前知道的最大的孪生素数是1159142985×2^2304-1和1159142985×2^2304+1。
6. 歌德巴赫猜想:大于2的所有偶数均是两个素数的和,大于5的所有奇数均是三个素数之和。其中第二个猜想是第一个的自然推论,因此歌德巴赫猜想又被称为1+ 1问题。我国数学家陈景润证明了1+2,即所有大于2的偶数都是一个素数和只有两个素数因数的合数的和。国际上称为陈氏定理。
文章来源: https://blog.csdn.net/qq_43412506/article/details/86737669