注:质数只需求到根号n,可用一数组保存1-n之间的素数,可以提高效率。
package com.xjj.algorithm;
import java.util.Scanner;
/*----找质因子----
* 1. 如 180=2*2*3*3*5
*
* 2. 对于一个正整数N,其质因子要么全部在根号n以内,要么只存在一个大于其根号
* */
public class Prime_factors {
public static int n; //带求数n
public static int prime_num = 0; //记录在2-n间素数的个数
public int[] prime = new int[n]; //保存素数的数组
//判断是否为素数
public boolean is_prime(int n){
if (n == 1)
return false;
//只需在其根号就行
int sqr = (int)Math.sqrt(n);
for(int i = 2; i < sqr; i++)
if (n % i == 0)
return false;
return true;
}
//找2-n之间的素数
public void find_prime(int n){
for(int i = 2; i < n; i++)
//如果为素数保存并记录个数
if (is_prime(i))
prime[prime_num++] = i;
}
//保存其质因子的类(结构体)
class factor{
int x; //质因子
int count = 0; //该之因子个数
}
public void print(int n){
find_prime(n); //先找素数集合
//因为2*3*5*7*13*17*19*23*19已经超过了int范围,故数组空间10就可以
factor[] fac = new factor[10];
int num = 0; //记录不同质因子的个数
if (n == 1)
System.out.println("1 = 1");
else {
System.out.print(n + " = ");
int sqr = (int)Math.sqrt(n);
//枚举根号以内的质因子
for(int i = 0; i < prime_num && prime[i] <= sqr; i++){
if (n % prime[i] == 0) {
fac[num] = new factor();
fac[num].x = prime[i]; //保存其质因子
while(n % prime[i] == 0){ //计算出该质因子的个数
fac[num].count++;
n /= prime[i];
}
num++; //不同质因子数加一
}
if (n == 1) break; //除尽,退出
}
if (n != 1) { //如果无法被其根号内除尽
fac[num] = new factor();
fac[num].x = n; //那么为其n
fac[num++].count++;
}
}
//输出
for(int i = 0; i < num; i++){
if (i > 0)
System.out.print("*");
for(int j = 0; j < fac[i].count; j++){
if (j > 0)
System.out.print("*");
System.out.print(fac[i].x);
}
}
}
public static void main(String[] args) {
System.out.println("输入一个数: ");
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
Prime_factors prime = new Prime_factors();
prime.print(n);
}
}