筆試題目當中,找素數出現的幾率有點大。昨天就做了一個,感覺不是很難,但可以考查程序員的數學和編碼功底。
用嵌套循環來實現是很理想的,怎樣減少循環的次數?怎樣求出小於N的所有質數?
不可能將一個數除與所有小於它的數字,只要檢查到N的平方根就好了。但直接開根號還有個精度的問題。這個可能會產生誤差。
索性將判斷條件寫成 i*i<=N ,道理也是很簡單的 i 大於N 的平方根,在檢查 第一個 i 除數 N 之前可以先檢查 小於第二個 i 是否可以 整除 N。
下面自己敲的求素數:
import java.util.ArrayList; public class Prime { public static int[] findPrime(final int max) { int[] prime = new int[max + 1]; ArrayList list = new ArrayList(); // 兩個嵌套循環 ,賦值不是質數 for (int j = 2; j * j <= max; j++) { for (int k = 2*j; k <= max; k++) { if (k % j == 0) { //不是質數 數組對應賦值為1 prime[k] = 1; } } } for (int i = 2; i < max; i++) { //因為JAVA數組默認賦值為整數“0”,所以所有是質數的經過上面的嵌套循環數組所對應的值是沒有發生的 if (prime[i] == 0) { list.add(new Integer(i)); } } //將list 轉換為數組返回 int[] p = new int[list.size()]; for (int i = 0; i < list.size(); i++) { p[i] = (Integer) list.get(i); } return p; } public static void main(String[] args) { int[] prime = Prime.findPrime(1000); for (int i = 0; i < prime.length; i++) { System.out.print(prime[i] + " "); } } }