任何一个数都可以写成:6N,6N+1,6N+2,6N+3,6N+4,6N+5(N为0.1.2.3.....)中的一种形式(因为对任何一个数对6取模一定能得到这其中的一个形式)
其中当N大于等于1时,6N,6N+2,6N+4,都能被2整除,6N+3能被3整除。所以6N,6N+2,6N+3,6N+4,都不可能是素数
所以只要对6N+1,6N+5进行素数测试就能得到所有给定范围内的素数。
时间复杂度严格小于O(sqrt(N)*N)
int prime[max],k=0; bool IsPrime(int x) { if(x==2) return true; if(k%2==0) return false; for(int i=3;i*i<k;i++) { if(k%i==0) return false; } return true; } void doprime() { for(int i=0;i<=max;i+=3) { for(int j=0;j<2;j++) if(IsPrime(2(i+j)-1)) prime[k++]=2(i+j)-1; } }
时间: 2024-10-09 20:06:25