在java編程中,經(jīng)常會(huì)遇到需要對(duì)特定數(shù)據(jù)進(jìn)行篩選和處理的場(chǎng)景。查找指定范圍內(nèi)的素?cái)?shù)并以數(shù)組形式返回,是這類(lèi)問(wèn)題的一個(gè)典型示例。本教程將詳細(xì)闡述如何構(gòu)建一個(gè)功能完善、結(jié)構(gòu)清晰的解決方案。
素?cái)?shù)(或稱(chēng)質(zhì)數(shù))是指在大于1的自然數(shù)中,除了1和它本身以外不再有其他因數(shù)的數(shù)。例如,2、3、5、7都是素?cái)?shù)。一個(gè)高效且正確的素?cái)?shù)判斷方法是整個(gè)解決方案的基礎(chǔ)。
以下是 isPrime 方法的優(yōu)化實(shí)現(xiàn):
public class Prime { /** * 判斷一個(gè)整數(shù)是否為素?cái)?shù)。 * 進(jìn)行了以下優(yōu)化: * 1. 小于等于1的數(shù)不是素?cái)?shù)。 * 2. 2是唯一的偶數(shù)素?cái)?shù)。 * 3. 所有大于2的偶數(shù)都不是素?cái)?shù)。 * 4. 循環(huán)檢查因子時(shí),只需檢查到數(shù)的平方根即可。 * * @param n 待判斷的整數(shù) * @return 如果n是素?cái)?shù)則返回true,否則返回false */ private boolean isPrime(int n) { // 1及以下不是素?cái)?shù) if (n <= 1) { return false; } // 2是最小的素?cái)?shù) if (n == 2) { return true; } // 所有大于2的偶數(shù)都不是素?cái)?shù) if (n % 2 == 0) { return false; } // 從3開(kāi)始,只檢查奇數(shù)因子,直到其平方根 // 因?yàn)槿绻鹡有一個(gè)大于其平方根的因子,那么它必然還有一個(gè)小于其平方根的因子 for (int i = 3; i * i <= n; i += 2) { if (n % i == 0) { return false; // 發(fā)現(xiàn)因子,不是素?cái)?shù) } } return true; // 沒(méi)有發(fā)現(xiàn)因子,是素?cái)?shù) } // 后續(xù)的 test 方法將在此處添加 }
代碼解析:
有了 isPrime 方法,我們就可以遍歷給定范圍 [a, b] 內(nèi)的所有整數(shù),并利用 isPrime 判斷它們是否為素?cái)?shù)。由于我們事先不知道范圍內(nèi)有多少個(gè)素?cái)?shù),所以不能直接創(chuàng)建一個(gè)固定大小的數(shù)組。這時(shí),java.util.ArrayList 提供了一個(gè)靈活的解決方案。ArrayList 可以在運(yùn)行時(shí)動(dòng)態(tài)地添加元素。
立即學(xué)習(xí)“Java免費(fèi)學(xué)習(xí)筆記(深入)”;
在收集完所有素?cái)?shù)后,我們需要將其轉(zhuǎn)換為 int[] 數(shù)組,因?yàn)榉椒ê灻蠓祷?int[]。Java 8 引入的 Stream API 使得這種轉(zhuǎn)換變得非常簡(jiǎn)潔。
import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; // 盡管這里直接用toArray,但import List是必須的 public class Prime { // ... isPrime 方法(如上所示) ... /** * 在指定范圍內(nèi)查找所有素?cái)?shù),并將其作為整型數(shù)組返回。 * 該方法遵循職責(zé)分離原則,不進(jìn)行任何輸出操作,只負(fù)責(zé)計(jì)算和返回?cái)?shù)據(jù)。 * * @param a 范圍的起始值(包含) * @param b 范圍的結(jié)束值(包含) * @return 包含指定范圍內(nèi)所有素?cái)?shù)的整型數(shù)組 */ public int[] test(int a, int b) { // 使用ArrayList來(lái)動(dòng)態(tài)收集素?cái)?shù) List<Integer> resultList = new ArrayList<>(); // 遍歷指定范圍內(nèi)的所有整數(shù) // 注意:循環(huán)條件應(yīng)確保包含b for (int i = a; i <= b; i++) { if (isPrime(i)) { resultList.add(i); // 如果是素?cái)?shù),則添加到列表中 } } // 將List<Integer>轉(zhuǎn)換為int[] // 使用Stream API的mapToInt和toArray方法,高效完成轉(zhuǎn)換 return resultList.stream() .mapToInt(Integer::intValue) // 將Integer對(duì)象映射為int基本類(lèi)型 .toArray(); // 將流中的元素收集到int數(shù)組中 } }
代碼解析:
根據(jù)要求,所有的輸出操作(System.out.println)都應(yīng)該在 Main 類(lèi)中進(jìn)行。這意味著 Prime 類(lèi)中的 isPrime 和 test 方法只負(fù)責(zé)計(jì)算和返回?cái)?shù)據(jù),不涉及任何打印。這種職責(zé)分離是良好的編程實(shí)踐,它提高了代碼的模塊化、可測(cè)試性和可重用性。
基于AI數(shù)字人能力,實(shí)現(xiàn)7*24小時(shí)AI數(shù)字人直播帶貨,低成本實(shí)現(xiàn)直播業(yè)務(wù)快速增增,全天智能在線(xiàn)直播
public class Main { public static void main(String... args) { // 實(shí)例化Prime類(lèi),以便調(diào)用其方法 Prime p = new Prime(); // 調(diào)用test方法,獲取指定范圍內(nèi)的素?cái)?shù)數(shù)組 // 例如,查找10到30之間的素?cái)?shù) int[] primeNumbers = p.test(10, 30); // 遍歷并打印返回的素?cái)?shù)數(shù)組 System.out.println("指定范圍內(nèi)的素?cái)?shù)有:"); if (primeNumbers.length == 0) { System.out.println("無(wú)"); } else { for (int i = 0; i < primeNumbers.length; i++) { System.out.print(primeNumbers[i]); if (i < primeNumbers.length - 1) { System.out.print(", "); } } System.out.println(); // 換行 } // 示例:查找1到10之間的素?cái)?shù) int[] primes1to10 = p.test(1, 10); System.out.println("1到10之間的素?cái)?shù)有:"); for (int prime : primes1to10) { System.out.print(prime + " "); } System.out.println(); } }
代碼解析:
為了方便讀者理解和運(yùn)行,以下是 Prime.java 和 Main.java 的完整代碼:
Prime.java
import java.util.ArrayList; import java.util.List; public class Prime { /** * 判斷一個(gè)整數(shù)是否為素?cái)?shù)。 * 進(jìn)行了以下優(yōu)化: * 1. 小于等于1的數(shù)不是素?cái)?shù)。 * 2. 2是唯一的偶數(shù)素?cái)?shù)。 * 3. 所有大于2的偶數(shù)都不是素?cái)?shù)。 * 4. 循環(huán)檢查因子時(shí),只需檢查到數(shù)的平方根即可。 * * @param n 待判斷的整數(shù) * @return 如果n是素?cái)?shù)則返回true,否則返回false */ private boolean isPrime(int n) { if (n <= 1) { return false; } if (n == 2) { return true; } if (n % 2 == 0) { return false; } for (int i = 3; i * i <= n; i += 2) { if (n % i == 0) { return false; } } return true; } /** * 在指定范圍內(nèi)查找所有素?cái)?shù),并將其作為整型數(shù)組返回。 * 該方法遵循職責(zé)分離原則,不進(jìn)行任何輸出操作,只負(fù)責(zé)計(jì)算和返回?cái)?shù)據(jù)。 * * @param a 范圍的起始值(包含) * @param b 范圍的結(jié)束值(包含) * @return 包含指定范圍內(nèi)所有素?cái)?shù)的整型數(shù)組 */ public int[] test(int a, int b) { // 確保范圍有效,如果a大于b,可以考慮拋出異?;蚍祷乜諗?shù)組 if (a > b) { return new int[0]; // 返回空數(shù)組 } List<Integer> resultList = new ArrayList<>(); for (int i = a; i <= b; i++) { if (isPrime(i)) { resultList.add(i); } } // 將List<Integer>轉(zhuǎn)換為int[] return resultList.stream() .mapToInt(Integer::intValue) .toArray(); } }
Main.java
public class Main { public static void main(String... args) { Prime p = new Prime(); // 示例1:查找10到30之間的素?cái)?shù) int[] primeNumbers1 = p.test(10, 30); System.out.println("10到30之間的素?cái)?shù)有:"); if (primeNumbers1.length == 0) { System.out.println("無(wú)"); } else { for (int i = 0; i < primeNumbers1.length; i++) { System.out.print(primeNumbers1[i]); if (i < primeNumbers1.length - 1) { System.out.print(", "); } } System.out.println(); } // 示例2:查找1到10之間的素?cái)?shù) int[] primeNumbers2 = p.test(1, 10); System.out.println("1到10之間的素?cái)?shù)有:"); if (primeNumbers2.length == 0) { System.out.println("無(wú)"); } else { for (int prime : primeNumbers2) { System.out.print(prime + " "); } System.out.println(); } // 示例3:查找一個(gè)沒(méi)有素?cái)?shù)的范圍 (例如:4到6) int[] primeNumbers3 = p.test(4, 6); System.out.println("4到6之間的素?cái)?shù)有:"); if (primeNumbers3.length == 0) { System.out.println("無(wú)"); } else { for (int prime : primeNumbers3) { System.out.print(prime + " "); } System.out.println(); } // 示例4:無(wú)效范圍 (a > b) int[] primeNumbers4 = p.test(30, 10); System.out.println("30到10之間的素?cái)?shù)有:"); if (primeNumbers4.length == 0) { System.out.println("無(wú)"); } else { for (int prime : primeNumbers4) { System.out.print(prime + " "); } System.out.println(); } } }
通過(guò)本教程,您應(yīng)該已經(jīng)掌握了如何在Java中查找指定范圍內(nèi)的素?cái)?shù),并將其封裝成數(shù)組返回的完整過(guò)程,同時(shí)也理解了代碼結(jié)構(gòu)和設(shè)計(jì)上的最佳實(shí)踐。
以上就是Java實(shí)現(xiàn)指定范圍素?cái)?shù)查找及結(jié)果數(shù)組封裝指南的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)