任何一个自然数都可以表示成如下的形式之一(除6保留余数):6N,6N+1,6N+2,6N+3,6N+4,6N+5 (N=0,1,2,3…) ,当N>=1时,6N、6N+3(被3除),6N+2、6N+4(被2除)都不是素数,只有6N+1和6N+5有可能是素数。6N+5即为6N-1。所以除了2和3外,可能的素数可表示为6N+(-)1。在此基础上,可以变形为
6N+1==6N+2*1-1==2(3N+1)-1
6N-1==6N+2*0-1==2(3N+0)-1
==>2(3N+M)-1;
这样6N+(-)1就可以统一为2(3N+M)-1,这样就需要二重循环,把N的循环做为外层,M做为内层循环,M取0和1。
所以总的代码可以写为
public class Test{ public static void main(String[] args) { int x = 500; int a = 2, b = 3; label1: for(int i=1; ; i++){ label2: for(int j=0; j<2; j++){ int prime = 2*(3*i+j)-1; if(prime>x){ break label1; } for(int k=2; k*k<=prime; k++){ if(prime%k==0){ continue label2; } } System.out.print(prime+" "); } } } }
结果:
用了带标签的break和continue。