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

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

用于素数分解算法的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Arduino Serial系列函数 有关print read 的总结

总结一下 在学习arduino srial函数时 的几个知识点&#xff1a; /*** 汇总一下Serial.print输出的一些情况&#xff0c;后面部分要和Serial.read配合使用&#xff1b;* 1. print 输出字符 和int数的结果&#xff0c;* 2. print 输出字符串和一连串的数字* 3. read 读取一个字符…

C#经典名著:《C#入门经典》(第4版)

博客园专题&#xff1a;http://book.cnblogs.com/zt/begin_csharp/ 作  者&#xff1a; &#xff08;美&#xff09;沃森&#xff08;Watson&#xff0c;K.&#xff09;&#xff0c;&#xff08;美&#xff09;内格尔&#xff08;Nagel&#xff0c;C.&#xff09; 等著&#…

inheritPrototypal.js

// 原型式继承// 其基本思路是借助原型可以基于已有的对象创建新的对象function object(o){function F(){}F.prototype o;return new F();}var person {name: "Tom",friends: ["Jack", "John", "Kim"]};var David object(person);…

vue 用户输入搜索 与无限下拉

vue项目中,用户输入关键字搜索,并且手机端做无限下拉 watch: {getListForm.searchKey(val) { this.radioChange(); // 还有其他逻辑,内部调用getDeviceList}} 1 getDeviceList() {2 apiGetDeviceList(Qs.stringify(this.getListForm)).then(res > {3 …

您必须学习Java 8的函数式编程吗?

我最近一直在研究Java 8&#xff0c;并掌握了Manning出版的“ Java 8 In Action” 。 让我印象深刻的第一件事是Java 8的独特销售主张是函数式编程。 函数现在是一流的变量&#xff0c;您可以像int或String一样在代码中传递它们。 这是一个很大的变化。 近年来&#xff0c;功能…

鞋扔布什游戏

布什同学立功了&#xff01;&#xff01;在经济如此不景气的情况下&#xff0c;布什给全世界人民增加了一点笑料&#xff0c;多么伟大的奉献精神。 前几天就看到一个Flash游戏&#xff0c;不过那个是扮演保镖&#xff0c;用枪打掉扔向布什的鞋子&#xff0c;很不爽&#xff0c;…

Arduino 软串口通信 的几点体会

1、arduino主板上的 RX TX 引脚 有时不一定够用&#xff0c;这时就需要将别的 引脚 通过软件 模拟成串口通信引脚&#xff0c;但不是每个引脚 都能这么转换&#xff0c;不同的板子&#xff0c;有所不同。 2、arduino Uno 上只有一个 RX TX 引脚&#xff0c;分别是 0和1 引脚…

coffee.js

()( () )( ( () ) )########################################################################### ##################### ################### ##################################### 更多专业前端知识&#xff0c;请上 【…

巨蟒django之权限6: 权限控制表设计登录权限

1.权限控制表设计 内容 1. 什么是权限&#xff1f; 2. 为什么要有权限&#xff1f;不同用户拥有不同的功能 3. 在web开发中&#xff0c;什么是权限&#xff1f;url 代表 权限4. 开发一个权限的组件&#xff0c;为什么要开发组件&#xff1f;5. 表结构的设计# 第一版权限表 pe…

AJAX Tookits -- ConfirmButton

在AJAX Toolkits中有个ConfirmButton的扩展控件&#xff0c;该控件只能应用与Button类型的控件&#xff0c;例如Button和LinkButton。 当你点击按键之后&#xff0c;系统会弹出一个确认框。基本属性如下&#xff1a; TargetControlID - Button或Link的控件编号.ConfirmText - 弹…

JavaMail可能是邪恶的(并迫使您重新启动应用程序服务器)

在配置JavaMail时&#xff0c;总是有一种有趣的方法。 基本上&#xff0c;您必须填写无类型的地图或属性结构&#xff0c;并希望获得正确的解释。 网络上无数的教程显示了使其正常工作&#xff08;发送/接收邮件&#xff09;所需的最小属性。 但是&#xff0c;正如我们痛苦地了…

CSS制作镂空字体

1.效果图 2.html内容&#xff1a; <!doctype html><html lang"en"><head> <meta charset"UTF-8"> <title>Document</title></head><style> body{background: rgb(248,248,248);} span{font-size: 240px;…

经济危机拒绝穷潇洒 试水充电战危机

寒假充电计划寒假春节元宵&#xff1f;寒假休息睡觉&#xff1f;寒假吃饭唱歌&#xff1f;寒假看电视看书&#xff1f;寒假朋友聚会外出旅游&#xff1f;……过了这么多个寒假&#xff0c;今年这个寒假&#xff0c;似乎注定要跟往年有些不一样。因为&#xff0c;今年这个冬天冷…

常用网站

编码转换&#xff1a; http://tool.oschina.net/encode?type2&#xff08; 支持&#xff1a; Native/UnicodeNative/UTF-8Native/ASCIIURL转码&#xff09;JSON在线解析及格式化验证 https://www.json.cn/ JSON 转 Java 实体类 http://www.bejson.com/json2javapojo/new/ RGB颜…

为什么要在Java的Serializable类中使用SerialVersionUID

序列化和SerialVersionUID始终是许多Java开发人员的难题。 我经常会看到类似此SerialVersionUID的问题&#xff0c;或者如果不在我的Serializable类中声明SerialVersionUID会发生什么情况&#xff1f; 除了涉及到的复杂性和罕见的使用之外&#xff0c;这些问题的另一个原因是Ec…

关于注入(css/c.js)

这几天朋友的网站天天被搞破坏的人恶意注入&#xff0c;也许是程序没写好的原因&#xff0c;数据库每个字段加了一段script&#xff08;<Script Srchttp://%63%2Enuclear3.com/css/c.js></Script>&#xff0c;而这个script地址时不时的有变化&#xff09;。 用一些…

js判断浏览器是否支持flash的方法

传统浏览器可以使用window.ActiveXObject检查浏览器是否启用相关的控件。检查浏览器是否启用flash控件&#xff0c;需要先检查浏览器是否支持ActiveXObject&#xff0c;可以使用typeof检查window.ActiveXObject是否等于undefined&#xff0c;语法&#xff1a; typeof window.Ac…

bzoj5328: [Sdoi2018]物理实验

果然我还是太菜了&#xff0c;爆了一天才过。。。。隔壁肉丝都不知道喊了多少句哎╮(╯▽╰)╭我又A了什么傻逼题(然鹅就是wf和国集的题QWQ) 其实这个题就是个裸题&#xff0c;但是我就是不会。。。 这个题第一步就是明显的旋转坐标系(不会的百度)&#xff0c;注意要先平移坐标…

什么是Windows RT

Windows RT(WinRT) 是 Windows 8 家族的一个新成员&#xff0c;而这也是此前 Windows on ARM(WOA) 的官方名称。Windows RT 专注于 ARM 平台&#xff0c;并不会单独零售&#xff0c;仅采用预装的方式发行。Windows RT 中将包含针对触摸操作进行优化的微软 Word、Excel、PowerPo…

Spring MVC和Thymeleaf:如何从模板访问数据

在典型的Spring MVC应用程序中&#xff0c; Controller类负责使用数据准备模型映射并选择要呈现的视图。 该model map允许视图技术的完整抽象&#xff0c;对于Thymeleaf而言&#xff0c;它被转换为Thymeleaf VariablesMap对象&#xff0c;该对象使所有定义的变量可用于模板中执…