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

这篇编程教程介绍了如何在Java中找到整数的素数因子。通过一个名为primeFactors的长整数方法,使用简单的蛮力逻辑找出素数因子并存储在集合中。文章还讨论了Set和List接口的区别,以及如何使用JUnit进行测试。
摘要由CSDN通过智能技术生成

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 factor
                copyOfInput /= 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接口,该接口不允许重复。 如果Interviewer要求您编写程序将数字除以其主要因子,然后打印所有因子,则需要使用List界面而不是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 factor
                copyOfInput /= 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;
    }
    
    @Test
    public void testOne() {
        assertEquals(list(), PrimeFactors.primeFactors(1));
    }
    
    @Test
    public void testTwo() {
        assertEquals(list(2), PrimeFactors.primeFactors(2));
    }

    @Test
    public void testThree() {
        assertEquals(list(3), PrimeFactors.primeFactors(3));
    }
    
    @Test
    public void testFour() {
        assertEquals(list(2,2), PrimeFactors.primeFactors(4));
    }
    
    @Test
    public 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

java整数的因式分解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值