编程课程中的常见家庭作业/任务之一是关于Prime Factorization。 要求您编写一个程序以找到给定整数的素因子 。 一个数字的质数因子是将精确地除以给定数字的所有质数。 例如,35的素数因子分别是7和5,它们本身都是素数,并且精确地除以35。上一次我上大学时进行了此练习,就像编写一个要求用户输入整数的程序一样然后在命令行中显示该数字的素数分解。 该程序也有变种,例如,看一下本练习,编写一个程序以提示用户输入正整数,并以降序显示所有最小因子。 它与前面提到的素因数分解问题大致相同,但是有一些以降序显示的问题。 显示根本不是问题,您可以在命令提示符或GUI中轻松显示它,主要是编写逻辑来找到主要因素,这就是您将在本编程教程中学到的。 请记住,我们不能使用直接解决问题的API方法,例如,不允许使用StringBuffer的反向方法来反向Java中的String。 您需要使用原始编程结构(例如控制语句,循环,算术运算符等)来编写素数分解的核心逻辑。
在这里不拖延,这里是我们找到主要因素的完整Java程序。 计算素数的逻辑写在方法primeFactors(长整数)内部,这是查找素数的简单蛮力逻辑。 我们从2开始,因为那是第一个质数,并且每个数字也可以被1整除,然后进行迭代,直到通过一次递增和步进来找到质数。 当我们找到一个素数因子时,我们将其存储在Set中,并减少循环数。 为了运行该程序,您可以简单地将其复制粘贴到文件PrimeFactors.java中,然后使用javac和java命令进行编译和运行。 如果您发现运行此程序有任何困难,还可以参考本文,以获取有关如何从命令提示符运行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中引入了它的菱形运算符可以更好地进行类型推断。 现在,您无需在表达式的两面都编写类型参数,就像您在Java 1.6中所做的那样,这使它们更具可读性。 现在回到练习,如果您查看输出,它仅返回唯一的质因数,因为我们使用的是Set接口,该接口不允许重复。 如果您的采访员要求您编写程序以将数字除以其主要因子,并打印所有因子,那么您需要使用“列表”界面而不是“设置”。 例如, '72 '的唯一质数为[2,3],但以质数为单位的数字为[ 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界面之间的区别 ,这对初学者来说非常重要。
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]
现在,是时候练习编写一些JUnit测试了。 实际上,有两种测试代码的方法,一种是编写main方法,调用方法并自己比较实际输出与预期输出。 其他更高级,更可取的方法是使用JUnit之类的单元测试框架来执行此操作。 如果您遵循测试驱动的开发,那么甚至可以在编写代码之前编写测试,然后让测试驱动您的设计和编码。 让我们看看我们的程序在一些JUnit测试中的表现如何。
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中,我们有五个测试用例来测试拐角案例,单个素因案例和多个素因案例。 我们还创建了一个实用程序方法list(int…ints) ,该方法利用Java 5 varargs返回给定数字的List。 您可以使用任意数量的参数(包括零)来调用此方法,在这种情况下,它将返回一个空的List。 如果您愿意,可以扩展我们的测试类以添加更多测试,例如性能测试,或一些特殊情况测试以测试我们的素因分解算法。
这是我们的JUnit测试的输出,如果是您的新产品,还可以查看本教程,以学习如何创建和运行JUnit测试 。
这就是如何在Java中查找整数的素数。 如果您需要更多练习,还可以查看以下20种编程练习,涉及各种主题,例如LinkdList,String,Array,Logic和Concurrency。
- 如何在Java中不使用临时变量的情况下交换两个数字? ( 把戏 )
- 如何检查LinkedList是否包含Java循环? ( 解决方案 )
- 编写程序以检查数字是否为2的幂? ( 回答 )
- 如何通过一遍查找LinkedList的中间元素? (有关解决方案,请参见此处 )
- 如何检查数字是否为素数? ( 解决方案 )
- 编写程序来查找给定数字的斐波那契数列? ( 解决方案 )
- 如何检查号码是否是阿姆斯特朗号码? ( 解决方案 )
- 编写一个程序来防止Java死锁? (单击此处获取解决方案)
- 编写一个程序来解决Java中的Producer Consumer问题。 ( 解决方案 )
- 如何在不使用API方法的情况下反转Java中的String? ( 解决方案 )
- 编写程序来使用Java中的递归来计算阶乘? (单击此处获取解决方案)
- 如何检查数字是否为回文? ( 解决方案 )
- 如何检查数组是否包含重复的数字? ( 解决方案 )
- 如何从Java中的ArrayList中删除重复项? ( 解决方案 )
- 编写一个Java程序,以查看两个String是否是Anagram? ( 解决方案 )
- 如何计算字符串中字符的出现次数? ( 解决方案 )
- 如何从Java中的String查找第一个非重复字符? (有关解决方案,请参见此处 )
- 编写程序以检查Java中的数字是否为二进制? ( 解决方案 )
- 如何在不使用Collection API的情况下从数组中删除重复项? ( 解决方案 )
- 编写一个程序来计算Java中数字的总和? ( 解决方案 )
翻译自: https://www.javacodegeeks.com/2014/05/how-to-find-prime-factors-of-integer-numbers-in-java-factorization.html