在java編程中,我們經(jīng)常需要處理數(shù)字的特性,其中素數(shù)(質(zhì)數(shù))的查找是一個經(jīng)典的算法問題。本教程將指導(dǎo)你如何編寫一個程序,在給定范圍內(nèi)查找所有素數(shù),并將它們收集到一個數(shù)組中返回。此外,我們將遵循良好的編程實踐,將核心計算邏輯與輸出操作分離。
首先,我們需要一個輔助方法來判斷一個給定的整數(shù)是否為素數(shù)。一個素數(shù)是大于1的自然數(shù),除了1和它本身以外不再有其他因數(shù)。
以下是 isPrime 方法的實現(xiàn),它接受一個整數(shù) n 作為參數(shù),如果 n 是素數(shù)則返回 true,否則返回 false。
public class Prime { /** * 判斷一個整數(shù)是否為素數(shù)。 * * @param n 待判斷的整數(shù)。 * @return 如果 n 是素數(shù)則返回 true,否則返回 false。 */ private boolean isPrime(int n) { // 小于2的數(shù)都不是素數(shù) if (n < 2) { return false; } // 遍歷從2到 n-1 的所有整數(shù),檢查是否有因數(shù) for (int i = 2; i < n; i++) { if (n % i == 0) { // 如果能被整除,則不是素數(shù) return false; } } // 如果循環(huán)結(jié)束都沒有找到因數(shù),則是素數(shù) return true; } // ... 其他方法 }
說明:
接下來,我們將實現(xiàn) test 方法,該方法負(fù)責(zé)在指定范圍 [a, b] 內(nèi)查找所有素數(shù),并將它們收集起來。根據(jù)要求,這個方法不應(yīng)該直接進(jìn)行控制臺輸出(即不使用 System.out.println),而是將結(jié)果以數(shù)組的形式返回。
立即學(xué)習(xí)“Java免費學(xué)習(xí)筆記(深入)”;
為了動態(tài)地收集素數(shù),我們不能直接使用固定大小的數(shù)組,因為我們事先不知道范圍內(nèi)有多少個素數(shù)。因此,java.util.ArrayList 是一個理想的選擇,它允許我們動態(tài)地添加元素。收集完成后,我們可以將 ArrayList 轉(zhuǎn)換為 int 數(shù)組。
import java.util.ArrayList; import java.util.List; // import java.util.stream.Collectors; // 在此場景下不需要顯式導(dǎo)入 public class Prime { // ... isPrime 方法 /** * 在指定范圍內(nèi)查找所有素數(shù),并以整型數(shù)組形式返回。 * * @param a 范圍的起始值(包含)。 * @param b 范圍的結(jié)束值(包含)。 * @return 包含指定范圍內(nèi)所有素數(shù)的整型數(shù)組。 */ public int[] test(int a, int b) { // 使用 ArrayList 動態(tài)存儲找到的素數(shù) List<Integer> primeNumbers = new ArrayList<>(); // 遍歷指定范圍內(nèi)的所有整數(shù) for (int i = a; i <= b; i++) { // 調(diào)用 isPrime 方法判斷當(dāng)前數(shù)字是否為素數(shù) if (isPrime(i)) { // 如果是素數(shù),則添加到列表中 primeNumbers.add(i); } } // 將 List<Integer> 轉(zhuǎn)換為 int[] // 使用 Java 8 Stream API,簡潔高效 return primeNumbers.stream() .mapToInt(Integer::intValue) // 將 Integer 對象映射為 int 基本類型 .toArray(); // 轉(zhuǎn)換為 int 數(shù)組 } }
說明:
最后,在 Main 類中,我們將創(chuàng)建 Prime 類的實例,調(diào)用 test 方法獲取素數(shù)數(shù)組,并將其打印到控制臺。由于 test 方法返回的是一個數(shù)組,直接使用 System.out.println() 打印數(shù)組會輸出其內(nèi)存地址,因此我們需要使用 java.util.Arrays.toString() 方法來獲取數(shù)組內(nèi)容的字符串表示。
import java.util.Arrays; // 導(dǎo)入 Arrays 工具類,用于打印數(shù)組內(nèi)容 public class Main { public static void main(String... args) { // 創(chuàng)建 Prime 類的實例 Prime p = new Prime(); // 調(diào)用 test 方法,獲取 10 到 30 范圍內(nèi)的素數(shù)數(shù)組 int[] resultPrimes = p.test(10, 30); // 使用 Arrays.toString() 打印數(shù)組內(nèi)容 System.out.println("指定范圍內(nèi)的素數(shù): " + Arrays.toString(resultPrimes)); } }
運行結(jié)果示例:
指定范圍內(nèi)的素數(shù): [11, 13, 17, 19, 23, 29]
為了方便理解和運行,以下是 Prime.java 和 Main.java 兩個文件的完整代碼:
即構(gòu)數(shù)智人是由即構(gòu)科技推出的AI虛擬數(shù)字人視頻創(chuàng)作平臺,支持?jǐn)?shù)字人形象定制、短視頻創(chuàng)作、數(shù)字人直播等。
Prime.java
import java.util.ArrayList; import java.util.List; public class Prime { /** * 判斷一個整數(shù)是否為素數(shù)。 * * @param n 待判斷的整數(shù)。 * @return 如果 n 是素數(shù)則返回 true,否則返回 false。 */ private boolean isPrime(int n) { if (n < 2) { return false; } for (int i = 2; i < n; i++) { if (n % i == 0) { return false; } } return true; } /** * 在指定范圍內(nèi)查找所有素數(shù),并以整型數(shù)組形式返回。 * * @param a 范圍的起始值(包含)。 * @param b 范圍的結(jié)束值(包含)。 * @return 包含指定范圍內(nèi)所有素數(shù)的整型數(shù)組。 */ public int[] test(int a, int b) { List<Integer> primeNumbers = new ArrayList<>(); for (int i = a; i <= b; i++) { if (isPrime(i)) { primeNumbers.add(i); } } return primeNumbers.stream() .mapToInt(Integer::intValue) .toArray(); } }
Main.java
import java.util.Arrays; public class Main { public static void main(String... args) { Prime p = new Prime(); int[] resultPrimes = p.test(10, 30); System.out.println("指定范圍內(nèi)的素數(shù): " + Arrays.toString(resultPrimes)); } }
isPrime 方法的效率優(yōu)化: 當(dāng)前的 isPrime 方法在檢查因數(shù)時,循環(huán)到了 n-1。實際上,我們只需要檢查到 √n 即可。因為如果 n 有一個大于 √n 的因數(shù) k,那么它必然有一個小于 √n 的因數(shù) n/k。此外,可以提前處理偶數(shù)和2,進(jìn)一步提高效率。
優(yōu)化后的 isPrime 示例:
private boolean isPrimeOptimized(int n) { if (n <= 1) return false; // 0, 1 不是素數(shù) if (n == 2) return true; // 2 是素數(shù) if (n % 2 == 0) return false; // 所有其他偶數(shù)都不是素數(shù) // 只檢查奇數(shù)因數(shù),從3開始,到 sqrt(n) for (int i = 3; i * i <= n; i += 2) { if (n % i == 0) { return false; } } return true; }
在實際應(yīng)用中,建議使用優(yōu)化后的 isPrime 方法。
List<Integer> 到 int[] 轉(zhuǎn)換的替代方案: 如果你的項目不支持Java 8 Stream API,或者你偏好傳統(tǒng)的循環(huán)方式,可以將 ArrayList 手動轉(zhuǎn)換為 int[]:
// 替代 stream().mapToInt().toArray() 的方法 int[] resultArray = new int[primeNumbers.size()]; for (int i = 0; i < primeNumbers.size(); i++) { resultArray[i] = primeNumbers.get(i); } return resultArray;
職責(zé)分離的重要性: 本教程嚴(yán)格遵循了將核心計算邏輯(Prime 類中的 isPrime 和 test 方法)與用戶界面/輸出邏輯(Main 類中的 System.out.println)分離的原則。這種分離提高了代碼的模塊化、可測試性和復(fù)用性。Prime 類現(xiàn)在是一個純粹的計算工具類,不依賴于任何特定的輸出方式,可以在不同的應(yīng)用場景中靈活使用。
通過本教程,我們學(xué)習(xí)了如何在Java中實現(xiàn)一個高效且結(jié)構(gòu)清晰的素數(shù)查找器。我們首先構(gòu)建了 isPrime 方法來判斷單個數(shù)字的素數(shù)性,然后利用 ArrayList 動態(tài)收集指定范圍內(nèi)的素數(shù),并通過Java 8 Stream API將其轉(zhuǎn)換為 int 數(shù)組返回。最后,在主程序中負(fù)責(zé)調(diào)用并展示結(jié)果。此外,我們還探討了 isPrime 方法的性能優(yōu)化以及 List 到數(shù)組轉(zhuǎn)換的替代方案,并強調(diào)了職責(zé)分離在軟件開發(fā)中的重要性。掌握這些技巧將有助于你編寫更健壯、更高效的Java代碼。
以上就是Java中指定范圍內(nèi)素數(shù)查找與數(shù)組返回教程的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進(jìn)程會占用資源并降低性能。幸運的是,許多工具可以讓 Windows 保持平穩(wěn)運行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號