java整数的因式分解_如何在Java中找到整数的质数-因式分解
java整數(shù)的因式分解
編程課程中的常見家庭作業(yè)/任務(wù)之一是關(guān)于Prime Factorization。 要求您編寫一個程序以找到給定整數(shù)的素因子 。 一個數(shù)字的素數(shù)因子是將精確地除以給定數(shù)字的所有素數(shù)。 例如,素數(shù)因子35是7和5,它們本身都是素數(shù),并且精確地除以35。上一次我上大學(xué)時做此練習(xí),就像是編寫一個要求用戶輸入整數(shù)的程序然后在命令行中顯示該數(shù)字的素數(shù)分解。 該程序也有變種,例如,看一下本練習(xí),編寫一個程序以提示用戶輸入正整數(shù),并以降序顯示所有最小因子。 它與前面提到的素因數(shù)分解問題大致相同,但是有一些以降序顯示的問題。 顯示根本不是問題,您可以在命令提示符或GUI中輕松顯示它,主要是編寫邏輯來找到主要因素,這就是您將在本編程教程中學(xué)到的。 請記住,我們不能使用直接解決問題的API方法,例如,不允許您使用StringBuffer的反向方法來反向Java中的String。 您需要通過使用原始編程結(jié)構(gòu)(例如控制語句,循環(huán),算術(shù)運算符等)來編寫素數(shù)分解的核心邏輯。
在這里不拖延地介紹了我們找到主要因素的完整Java程序。 計算素數(shù)的邏輯寫在方法primeFactors(長整數(shù))內(nèi)部,這是查找素數(shù)的簡單蠻力邏輯。 我們從2開始,因為那是第一個質(zhì)數(shù),并且每個數(shù)字也可以被1整除,然后我們進(jìn)行迭代,直到通過一次遞增和步進(jìn)來找到質(zhì)數(shù)。 當(dāng)我們找到一個素數(shù)因子時,我們將其存儲在Set中,并減少數(shù)量直至循環(huán)。 為了運行該程序,您可以簡單地將其復(fù)制粘貼到文件PrimeFactors.java中,然后使用javac和java命令進(jìn)行編譯和運行。 如果您發(fā)現(xiàn)運行此程序有任何困難,還可以參考本文以獲取有關(guān)如何從命令提示符下運行Java程序的逐步指南。
import java.util.HashSet; import java.util.Random; import java.util.Scanner; import java.util.Set;/** * Java program to print prime factors of a number. For example if input is 15, * then it should print 3 and 5, similarly if input is 30, then it should * display 2, 3 and 5. * * @author Javin Paul */ public class PrimeFactors{public static void main(String args[]) {System.out.printf("Prime factors of number '%d' are : %s %n", 35, primeFactors(35));System.out.printf("Prime factors of integer '%d' are : %s %n", 72, primeFactors(72));System.out.printf("Prime factors of positive number '%d' is : %s %n", 189, primeFactors(189));System.out.printf("Prime factors of number '%d' are as follows : %s %n", 232321, primeFactors(232321));System.out.printf("Prime factors of number '%d' are as follows : %s %n", 67232321, primeFactors(67232321));}/*** @return prime factors of a positive integer in Java.* @input 40* @output 2, 5*/public static Set primeFactors(long number) {long i;Set primefactors = new HashSet<>();long copyOfInput = number;for (int i = 2; i <= copyOfInput; i++) {if (copyOfInput % i == 0) {primefactors.add(i); // prime factorcopyOfInput /= i;i--;}}return primefactors;}}Output: Prime factors of number '35' are : [5, 7] Prime factors of integer '72' are : [2, 3] Prime factors of positive number '189' is : [3, 7] Prime factors of number '232321' are as follows : [4943, 47] Prime factors of number '67232321' are as follows : [12343, 419, 13]如果您對那個尖括號<>感到好奇,那么Java 7中引入了它的菱形運算符可以更好地進(jìn)行類型推斷。 現(xiàn)在,您無需在表達(dá)式的兩面編寫類型參數(shù),就像在Java 1.6中一樣,這使它們更具可讀性。 現(xiàn)在回到練習(xí),如果您查看輸出,它僅返回唯一的質(zhì)因數(shù),因為我們正在使用Set接口,該接口不允許重復(fù)。 如果Interviewer要求您編寫程序?qū)?shù)字除以其主要因子,然后打印所有因子,則需要使用List界面而不是Set。 例如, '72 '的唯一質(zhì)數(shù)為[2,3],但以質(zhì)數(shù)為單位的數(shù)字為[ 2,2,2,3,3 ] 。 如果需要這種輸出,可以重寫我們的primeFactors(long number)方法以返回List <Integer> ,如下所示:
public static List<Integer> primeFactors(long number) {List<Integer> primefactors = new ArrayList<>();long copyOfInput = number;for (int i = 2; i <= copyOfInput; i++) {if (copyOfInput % i == 0) {primefactors.add(i); // prime factorcopyOfInput /= i;i--;}}return primefactors;}這是使用此版本的primeFactors(long number)方法運行相同程序的輸出。 這次您可以看到所有主要因素,而不僅僅是唯一因素。 這也解釋了Set和List界面之間的區(qū)別 ,這對初學(xué)者來說非常重要。
Prime factors of number '35' are : [5, 7] Prime factors of integer '72' are : [2, 2, 2, 3, 3] Prime factors of positive number '189' is : [3, 3, 3, 7] Prime factors of number '232321' are as follows : [47, 4943] Prime factors of number '67232321' are as follows : [13, 419, 12343]現(xiàn)在,是時候練習(xí)編寫一些JUnit測試了。 實際上,有兩種測試代碼的方法,一種是通過編寫main方法,調(diào)用方法并將自己的實際輸出與預(yù)期輸出進(jìn)行比較。 其他更高級和首選的方法是使用單元測試框架(如JUnit)來實現(xiàn)。 如果您遵循測試驅(qū)動的開發(fā),那么甚至可以在編寫代碼之前編寫測試,然后讓測試驅(qū)動您的設(shè)計和編碼。 讓我們看看我們的程序在一些JUnit測試中的表現(xiàn)如何。
import static org.junit.Assert.*; import java.util.ArrayList; import java.util.List; import org.junit.Test;public class PrimeFactorTest {private List<Integer> list(int... factors){List<Integer> listOfFactors = new ArrayList<>();for(int i : factors){listOfFactors.add(i);} return listOfFactors;}@Testpublic void testOne() {assertEquals(list(), PrimeFactors.primeFactors(1));}@Testpublic void testTwo() {assertEquals(list(2), PrimeFactors.primeFactors(2));}@Testpublic void testThree() {assertEquals(list(3), PrimeFactors.primeFactors(3));}@Testpublic void testFour() {assertEquals(list(2,2), PrimeFactors.primeFactors(4));}@Testpublic void testSeventyTwo() {assertEquals(list(2,2,2,3,3), PrimeFactors.primeFactors(72));} }在我們的測試類 PrimeFactorsTest中,我們有五個測試用例來測試拐角案例,單個素因案例和多個素因案例。 我們還創(chuàng)建了一個實用程序方法list(int…ints) ,該方法利用Java 5 varargs返回給定數(shù)字的List。 您可以使用任意數(shù)量的參數(shù)(包括零)來調(diào)用此方法,在這種情況下,它將返回一個空的List。 如果您愿意,可以擴展我們的測試類以添加更多測試,例如性能測試,或一些特殊情況測試以測試我們的素因分解算法。
這是我們的JUnit測試的輸出,如果是您的新產(chǎn)品,還可以查看本教程,以了解如何創(chuàng)建和運行JUnit測試 。
這就是如何在Java中查找整數(shù)的素數(shù)。 如果您需要更多練習(xí),還可以查看以下20個編程練習(xí),涉及各種主題,例如LinkdList,String,Array,Logic和Concurrency。
翻譯自: https://www.javacodegeeks.com/2014/05/how-to-find-prime-factors-of-integer-numbers-in-java-factorization.html
java整數(shù)的因式分解
總結(jié)
以上是生活随笔為你收集整理的java整数的因式分解_如何在Java中找到整数的质数-因式分解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生产备案编号(生产备案代码)
- 下一篇: 没有Javax的Jakarta EE:这