编程课程中的常见家庭作业/任务之一是关于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。

  1. 如何在Java中不使用临时变量的情况下交换两个数字? ( 把戏 )
  2. 如何检查LinkedList是否包含Java循环? ( 解决方案 )
  3. 编写程序以检查数字是否为2的幂? ( 回答 )
  4. 如何通过一遍查找LinkedList的中间元素? (有关解决方案,请参见此处 )
  5. 如何检查数字是否为素数? ( 解决方案 )
  6. 编写程序来查找给定数字的斐波那契数列? ( 解决方案 )
  7. 如何检查号码是否是阿姆斯特朗号码? ( 解决方案 )
  8. 编写一个程序来防止Java死锁? (单击此处获取解决方案)
  9. 编写一个程序来解决Java中的Producer Consumer问题。 ( 解决方案 )
  10. 如何在不使用API​​方法的情况下反转Java中的String? ( 解决方案 )
  11. 编写程序来使用Java中的递归来计算阶乘? (单击此处获取解决方案)
  12. 如何检查数字是否为回文? ( 解决方案 )
  13. 如何检查数组是否包含重复的数字? ( 解决方案 )
  14. 如何从Java中的ArrayList中删除重复项? ( 解决方案 )
  15. 编写一个Java程序,以查看两个String是否是Anagram? ( 解决方案 )
  16. 如何计算字符串中字符的出现次数? ( 解决方案 )
  17. 如何从Java中的String查找第一个非重复字符? (有关解决方案,请参见此处 )
  18. 编写程序以检查Java中的数字是否为二进制? ( 解决方案 )
  19. 如何在不使用Collection API的情况下从数组中删除重复项? ( 解决方案 )
  20. 编写一个程序来计算Java中数字的总和? ( 解决方案 )

翻译自: https://www.javacodegeeks.com/2014/05/how-to-find-prime-factors-of-integer-numbers-in-java-factorization.html

如何在Java中找到整数的质因数–因式分解相关推荐

  1. java整数的因式分解_如何在Java中找到整数的质数-因式分解

    java整数的因式分解 编程课程中的常见家庭作业/任务之一是关于Prime Factorization. 要求您编写一个程序以找到给定整数的素因子 . 一个数字的素数因子是将精确地除以给定数字的所有素 ...

  2. java 字符串 数组 索引_如何在Java中找到数组中元素的索引?

    我希望在Java中找到给定元素的索引,知道它的内容. 我尝试了以下示例,该示例不起作用: class masi { public static void main( String[] args ) { ...

  3. java timestamp时间差_关于datetime:如何在java中找到2个时间戳之间的日差

    本问题已经有最佳答案,请猛点这里访问. 我想计算2个时间戳之间有多少天的差异,但我不想考虑时差. 例如 : long time1 = 1546258765000  (Mon 31 December 2 ...

  4. 百分比怎么在java里显示_如何在java中找到百分比我的代码给出错误?

    我试图得到百分比,但我的代码给"0.0",而totalMemory和usageMemory都有我也设置4位小数的值,但结果是"0.0000"我的代码是, pri ...

  5. java 查找链表中间元素_如何在Java中一次性查找Java中链表的中间元素

    如何在一次传递中找到LinkedList的中间元素?这是一个 Java 和非Java程序员面试时经常被问到的编程问题.这个问题类似于检查回文或计算阶乘,有时也会要求编写代码.为了回答这个问题,候选人必 ...

  6. 【JAVA】求出区间[a,b]中所有整数的质因数分解。

    问题描述 求出区间[a,b]中所有整数的质因数分解. 输入格式 输入两个整数a,b. 输出格式 每行输出一个数的分解,形如k=a1*a2*a3...(a1<=a2<=a3...,k也是从小 ...

  7. java 精确到微妙_如何在Java中以微秒精度测量时间?

    我在Internet上看到应该使用System.nanoTime(),但这对我不起作用-它为我提供了毫秒级的时间.我只需要函数执行前后的微秒,就可以知道需要多长时间.我正在使用Windows XP. ...

  8. 如何在Java中比较日期? [重复]

    本文翻译自:How to compare dates in Java? [duplicate] This question already has answers here : 这个问题已经在这里有了 ...

  9. 如何在Java中创建一个新的List

    本文翻译自:How to make a new List in Java We create a Set as: 我们创建一个Set为: Set myset = new HashSet() How d ...

最新文章

  1. Linux Wi-Fi 编程API介绍
  2. 自制爬虫,爬取分类总阅读量,总评论量。全部文章阅读量和,以及评论量和。但是发现数据不对
  3. 【Python】青少年蓝桥杯_每日一题_12.27_输出回文数
  4. Echarts开源可视化库学习(三)主题的使用
  5. Angular目录结构分析以及app.module.ts详解
  6. 反射调用private或internal构造函数
  7. [转]Ubuntu 常用快捷键10个
  8. 贷款利息及公积金知识点
  9. Lighttpd 启用 HTTPS 并重定向 HTTP 为 HTTPS 访问配置
  10. python爬虫入门——爬取淘宝商品评论信息
  11. html5 斗鱼 苹果,斗鱼ios端手游直播方法
  12. 苹果闪存性能测试软件,iPhone6闪存是什么类型 iPhone6闪存类型检测教程
  13. 科技企业的技术文化为什么难写?
  14. 多维尺度分析(Multidimensional scaling,MDS)及SPSS实现
  15. Robot Framework Selenium UI自动化测试 --- 进阶篇
  16. 关于六边形地图的生成算法
  17. 2020互联网大厂职级对应薪资一览表。
  18. 静态分析工具PMD使用说明
  19. 华为aaa服务器是什么系统,华为aaa认证服务器-portal认证与aaa服务器什么关系
  20. 转:新浪给微米定下了哪些要求?

热门文章

  1. 服务器母鸡系统,母鸡云服务器
  2. javaweb调用python算法_请教怎么用java远程调用python? 多谢
  3. mybatis generator Unknown system variable 'query_cache_size' 的解决方法
  4. 关于 tomcat启动后无法访问的问题(localhost:8080 (or your port specified))
  5. javaone_JavaOne演讲者选择了您不容错过的10个会话
  6. @namedqueries_在@NamedQueries中枚举@NamedQuery
  7. java 根据类名示例化类_如何使用示例从Java中的类路径加载资源
  8. hbase 生成文件_HBase:为客户行为生成搜索点击事件统计信息
  9. 将Spring Boot应用程序部署到Tomcat中
  10. JDK 9、10和11中的安全性增强