题目:判断101-200之间有多少个素数,并输出所有素数。
程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
吐槽:简单的题,想仔细需要的参数,逻辑,边界控制,争取一次写对。
代码:
package com.oz.algorithm;
import java.util.ArrayList;
import java.util.List;
public class Prime{
public static List getPrime(){
short n = 101;
List<Short> prime = new ArrayList<Short>();
for(;n<=200;n++){
boolean isPrime = false;
for(short j=2;j<=Math.sqrt(n);j++){
if(n%j == 0){
isPrime = false;
break;
}else
isPrime = true;
}
if(isPrime)
prime.add(n);
}
System.out.println("Prime numbers are: "+ prime);
return prime;
}
}
测试:
package com.oz;
import com.oz.algorithm.Prime;
public class Test1{
public static void main(String args[]){
Prime.getPrime();
}
}
结果:
Prime numbers are: [101, 103, 107, 109, 113, 127, 131,
137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199]
上述判断质数的改进方法:
/*
* check if a number is prime or not
*/
public static boolean isPrime(int number){
if(number <= 1)
return false;
if(number == 2 || number ==3)
return true;
//a number more than 5 and not border upon 6 must not be a prime nunber
if( (number % 6 !=1) && (number % 6 != 5))
return false;
//here all numbers are adjacent to 6
for(int i=5;i<=Math.sqrt(number);i=i+6){
if(number%i ==0 || number%(i+2) == 0)
return false;
}
//the rest are all prime
return true;
}
这里解释一下,大于5的质数一定与6的倍数相邻。
而且这些数一定只能被自身,或者6的倍数的相邻数整除。
如果只能被自身整除,那么就是质数。
与6的倍数相邻但不是质数的数举例:
(6x-1)(6x+1) = 36x2-1 = 6(6x2) - 1 (x>=1)
这些数有质因数(6x-1)和(6x+1),与6倍数相邻但不是质数。