【如何列出质数】
输出在指定范围内的所有质数。
【编程思路】
1不是质数,也不是合数,把1排除。2是质数,保留,把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去,一直循环做下去,就会把不超过N的全部合数划去,留下的就是不超过N的全部质数。
【源代码】
1 package javaexamples; 2 import java.util.Arrays; 3 4 public class SuShu 5 { 6 private static boolean[] primeNumber(int num){//求质数 7 if(num<0){//检查指定的范围:质数必须大于零 8 System.out.println("范围必须大于0"); 9 return null; 10 } 11 boolean[] primes=new boolean[num+1];//声明布尔类型数组,长度为范围+1 12 primes[1]=false;//将特殊数字1抛出,因为1不是质数 13 Arrays.fill(primes,2,num+1,true);//将布尔数组元素的值都赋为true,2是索引值,从2开始,到num+1终止 14 int n=(int)Math.sqrt(num);//Math.sqrt()方法用于求开方 15 for(int i=1;i<n;i++){ 16 if(primes[i]){//如果是质数,那么i的倍数不是质数 17 for(int j=2*i;j<=num;j+=i){ 18 primes[j]=false; 19 } 20 } 21 } 22 return primes; 23 } 24 public static void showPrimeNumber(int num){//显示质数 25 boolean [] primes=primeNumber(num);//调用方法赋值给布尔类型的数组 26 int n =0; 27 if(primes!=null){ 28 for(int i=1;i<primes.length;i++){//循环数组操作数组的元素 29 if(primes[i]){//如果数组元素值为true,则下标值为质数 30 System.out.print(i+" ");//输出质数 31 if(++n%10==0)//以每行10个质数输出 32 System.out.println(); 33 } 34 } 35 System.out.println(); 36 } 37 System.out.print("一共有"+n+"个"); 38 } 39 public static void main(String[] args){ 40 int num = 100;//声明求质数的范围 41 System.out.println("范围在"+num+"内的质数有:"); 42 showPrimeNumber(num);//调用方法显示质数 43 } 44 }
【运行结果】
范围在100内的质数有:
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97
一共有25个
【关键技术解析】
1、定义两个方法,一个是求质数的,一个是显示质数的。
2、求质数时需要检查质数范围是否正确。
3、为了方便,将质数所在的布尔类型数组的index值与数字值相匹配,所以长度设置为范围+1。
4、Math.sqrt()方法用于求开方。
5、Array.fill(boolean[] a, int fromIndex, int toIndex, boolean val)
方法,是将指定的 boolean 值分配给指定 boolean 型数组指定范围中的每个元素。
6、在输出时,判断数组元素是否为true值,下标值即为质数,输出时较方便。
【心得】
感谢aniuer给了我java的中文API,今天学会了查阅,的确方便很多。
只是代码中primeNumber()方法中for循环的内容不太明白,还要仔细研究一下……