分解质因数
任何一个合数都可以写成几个质数相乘的形式。其中每个质数都是这个合数的因数,叫做这个合数的分解质因数。分解质因数只针对合数。
分解质因数的原因:
源于对数学的热爱,所以才会选择做这样一道题目,它的实际作用并不是很强。再者而言,做分解质因数可以帮助自己更好的理解方法之间的调用。前几天的博文中,我写了《找出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;
}
}
总结:
今天感觉到写博客给自己带来的好处了,之前总感觉写博客就是为了给别人看的,所以在写的过程中没有真正的透露自己的思想,现在感觉到,其实写博客是对自己经历的一种回忆,它能够帮助自更深刻的理解所学到的东西,也能够提醒自己是时候总结一下经验了,说不定在某个时刻,就用到了前面所记录的东西。在这样一个信息的时代,人大脑的短暂的容纳量还是有一定限度的,所以采用记笔记,写日记的方法能够帮助自己积累和记录有趣的思想。
- 第五天的学习思维导图: