数学知识:
所有的数都能够用6N+X的形式来表示,由于6N+2,6N+3,6N+4均不可能是质数。所以质数只能是形如6N+1和6N-1的形式来表示。
以求100个数内的质数为例。根据公式6N-1和6N+1,满足6N+1<=100这个条件。
- | - | - | - | 5 | - | 7 | - | - | - |
---|---|---|---|---|---|---|---|---|---|
11 | - | 13 | - | - | - | 17 | - | 19 | - |
- | - | 23 | - | 25 | - | - | - | 29 | - |
31 | - | - | - | 35 | - | 37 | - | - | - |
41 | - | 43 | - | - | - | 47 | - | 49 | - |
- | - | 53 | - | 55 | - | - | - | 59 | - |
61 | - | - | - | 65 | - | 67 | - | - | - |
71 | - | 73 | - | - | - | 77 | - | 79 | - |
- | - | 83 | - | 85 | - | - | - | 89 | - |
91 | - | - | - | 95 | - | 97 | - | - | - |
由表可知,1-100的质数都包含在列表中了。全都符合6N-1和6N+1的规律。
但是里面有一些数(25,49等)是5和7的倍数。
因此还需要再做进一步筛选,多加一些筛选条件。将5和7的倍数踢出去了。
问题1:
怎么才能计算6N-1和6N+1的中N的值。
答:由于6N+1<=n(比如求100以内的质数,n为100)。
用一个while循环来计算N的值。
public static int GetN(int n){
int N=1;
while(6*N+1<=n){
N++;
}
return N;
}
问题2:怎么用循环表示6N-1和6N+1.
答:总结规律法。
当N=1时 有 5,7 等同 (23-1,24-1)
当N=2时,有11,13 等同 (26-1,27-1)
当N=3时,有17,19 等同 (29-1,210-1)
…
当N=16时,有95,97 等同 (248-1,249-1)
我们可以很清楚的看出来右边的等式为(2i-1,2j+1),满足i<=3N这个条件。
而且i的初始值为3,且i=i+3每次以此递增。
而且j与i的关系为 j=i+1;
代码的设计比较巧妙,大家可以借鉴一下:
for(int i=3;i<=3*N;i=i+3){
for(int j=0;j<2;j++){
t=2*(i+j)-1;
}
}
总的代码如下:(前面的2和3一开始就初始化了,直接输出)
public class number {
public static int GetN(int n){
int N=1;
while(6*N+1<=n){
N++;
}
return N;
}
public static void isPrime(int n){
int N=GetN(n);
int t=0;
for(int i=3;i<=3*N;i=i+3){
for(int j=0;j<2;j++){
t=2*(i+j)-1;
if(t<n&&t % 5 !=0&&t%7!=0){
System.out.println("This is a prime number:"+t);
}
}
}
}
public static void main(String[] args){
System.out.println("This is a prime number:"+2);
System.out.println("This is a prime number:"+3);
isPrime(100);
}
}