每日一练No.4

【如何列出质数】

输出在指定范围内的所有质数。

【编程思路】

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循环的内容不太明白,还要仔细研究一下……

原文地址:https://www.cnblogs.com/mengqiqi/p/2683549.html