首页 > 技术文章 > 求素数

ant-xu 2019-07-16 11:19 原文

任何一个自然数都可以表示成如下的形式之一(除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。

质数:https://baike.baidu.com/item/%E8%B4%A8%E6%95%B0

推荐阅读