Java中分解质因数

分解质因数

任何一个合数都可以写成几个质数相乘的形式。其中每个质数都是这个合数的因数,叫做这个合数的分解质因数。分解质因数只针对合数。


分解质因数的原因:

源于对数学的热爱,所以才会选择做这样一道题目,它的实际作用并不是很强。再者而言,做分解质因数可以帮助自己更好的理解方法之间的调用。前几天的博文中,我写了《找出1-n内的素数》,那篇文章中谈到了自己是如何去寻找质数的,在本篇文章中我用到了判断质数的方法;还有写过一篇《统计兔子的数量》,在那篇文章中,我使用了递归函数的方法去解决问题,当时还不是十分的理解递归的应用,所以我尝试在这个问题运用递归的方法去分解因数,果然,帮助自己节约了运行的时间。


题目分析:

  • 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
    程序分析:

1.利用Scanner类得到一个正整数;
2.判断得到的正整数是否是一个质数,否就执行下面步骤,
(1).分解质因数
(2).定义一个集合,用于装分解出来的因数,
(3).对合数取商数和余数
(4).对余数进行判断是否是质数,是就跳出循环,否就执行循环体,直至是质数
3.遍历集合,打印出质因数。


代码块:

1.得到一个int类型的整数:

其实得到一个int数据类型的整数,只需要前面两行的代码,此处之所以写的后面的两行代码,主要是因为,后面用到了列表,所以就顺便创建了一个Integer类,这样就可以满足方便定义List中的泛型

System.out.println("请输入一个数用于因数分解:");
Scanner sc = new Scanner(System.in);
Integer m = new Integer(sc.nextInt());
int n = m;

2.创建一个分解因数的方法:

//创建一个方法用于分解因数
public static List<Integer>  FenJie(int n){
//判断得到的正整数是否是质数
    if(!isPrime(n)){
        //将n除以比n小的数
        for(int m = 2; m < n;m++){
        //如果出现m能够被整除就将m加入因数集合中
        if(n % m == 0 ){
            //将被整除的数添加到list列表中
            aList.add(m);
            //将商数赋值给n,对n进行判断
            n /= m;
            break;
            }
        }
        //递归调用分解因数的方法
        FenJie(n);
        }else{
            //将最后一个商数添加到list列表中
            aList.add(n);
        }
        //将添加完因数的列表返回给主方法
        return aList;
    }

3.调用判断质数的方法:

//创建一个方法用于判断是否是质数
public static boolean isPrime(int n){
    //定义一个变量用于判断数是否是素数
    boolean t = false;
    //当数字时2的时候,是素数返回true
    if(n==2){
        t = true;
        }
    //当数字不是2的时候,进行进一步判断
    for(int j = 2;j < n;j++){   
        if(j==(n-1)){
            t = true;
            }
        if((n % j)==0){
            break;
            }
        }
        return t;
    }

4.遍历集合并打印:

for(Integer list1 : aList){
    System.out.print("*"+list1);
}

实现分解因数的完整的代码:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class DecompositionFactor {
    /**
     * @param args
     * @作者:蒋毅
     * @描述:
     */ 
    public static List<Integer> aList = null;

    public static void main(String[] args){
        while(true){
            //创建一个Scanner对象,获得输入数字
            System.out.println("请输入一个数用于因数分解:");
            Scanner sc = new Scanner(System.in);
            Integer m = new Integer(sc.nextInt());
            int n = m;
            //创建一个集合用于装分解出来的因素
             aList = new ArrayList<Integer>();
            System.out.println(n+"分解因数后的结果:");
            System.out.print(n+" = 1");
            //分解因数
            FenJie(n);
            //遍历aList列表
            for(Integer list1 : aList){
                System.out.print("*"+list1);
            }
            System.out.println("\r"+"----------------------");
        }
    }
    //创建一个方法用于分解因数
    public static List<Integer>  FenJie(int n){
        //判断得到的正整数是否是质数
        if(!isPrime(n)){
            //将n除以比n小的数
            for(int m = 2; m < n;m++){
                //如果出现m能够被整除就将m加入因数集合中
                if(n % m == 0 ){
                    aList.add(m);
                    //将商数赋值给n,对n进行判断
                    n /= m;
                    break;
                }
            }
            FenJie(n);
        }else{
            aList.add(n);
        }
        return aList;

    }
    //创建一个方法用于判断是否是质数
    public static boolean isPrime(int n){
        //定义一个变量用于判断数是否是素数
        boolean t = false;

        //当数字时2的时候,是素数返回true
        if(n==2){
                t = true;
            }
        //当数字不是2的时候,进行进一步判断
        for(int j = 2;j < n;j++){   
            if(j==(n-1)){
                t = true;
                }
            if((n % j)==0){
                break;
                }
            }
        return t;
    }
}

总结:

今天感觉到写博客给自己带来的好处了,之前总感觉写博客就是为了给别人看的,所以在写的过程中没有真正的透露自己的思想,现在感觉到,其实写博客是对自己经历的一种回忆,它能够帮助自更深刻的理解所学到的东西,也能够提醒自己是时候总结一下经验了,说不定在某个时刻,就用到了前面所记录的东西。在这样一个信息的时代,人大脑的短暂的容纳量还是有一定限度的,所以采用记笔记,写日记的方法能够帮助自己积累和记录有趣的思想。


  • 第五天的学习思维导图:
    这里写图片描述

猜你喜欢

转载自blog.csdn.net/jiangyi_1612101_03/article/details/81292673
今日推荐