1.什么是分解质因数?
百度百科给出的解释是:每个合数都可以写成几个质数(质数指的是公约数只有1和它本身的数)相乘的形式。其中每个质数都是这个合数的因数,叫做这个合数的分解质因数。 分解质因数只针对合数。
2.算法思想
设定需要分解质因数的数为num。
(1)1是任何数的公约数,且1不是质数。一个数本身也是这个数的公约数。
(2)从2开始,循环至num-1,找出第一个能被num整除的质数(如何找到这个质数?判断一个数是不是质数,看它是否有除1和它本身以外的公约数),将这个质数压入栈中,将num整除质数后得到的数递归分解质因数,break结束当前循环。如果num整除质数后得到的数已经是一个质数,直接压入栈中,不递归循环分解了。
(3)最后,在栈中的就是num的质因数。
3.代码实现
package gdut.ff.data;
import java.util.Scanner;
import java.util.Stack;
/**
* @author liuffei
* @date 2017年7月7日
* @description 将一个数分解质因数
*/
public class DecomposingFactor {
//建立用来存储分解的质因数
public Stack stack = new Stack();
/**
* 递归
* @param number 要进行质因数分解的整数
* @return
*/
public Stack getResult(int num){
for(int i = 2;i <= num;i++){
if(isFactor(i)){
//找到一个质因数之后就压入栈中,将num除以质因数得到的数进行递归
if(num % i == 0){
stack.push(i);
num = num / i;
if(!isFactor(num)){
getResult(num);
}else{
//如果得到的数是质数,直接压入栈中,不用进行递归。
stack.push(num);
}
break;
}
}
}
return stack;
}
//判断一个数是否是质数(肯定不是偶数)
public boolean isFactor(int number){
for(int i = 2;i < number;i++){
if(number % i == 0){
return false;
}
}
return true;
}
}
4.测试
public static void main(String args[]){
DecomposingFactor test = new DecomposingFactor();
System.out.println("请输入要分解的数:");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
//对输入的数进行判断,如果是质数,抛出异常
if(test.isFactor(num)){
throw new IllegalArgumentException("只能对合数分解质因数");
}
Stack stack = test.getResult(num);
StringBuffer sb = new StringBuffer("");
sb.append(num);
sb.append("=");
while(!stack.empty()){
sb.append(stack.pop());
sb.append("*");
}
sb.deleteCharAt(sb.length()-1);
System.out.println(sb.toString());
}
5.运行效果
对合数分解质因数
对质数分解质因数