问题描述
给定一个正整数n,尝试对其分解质因数
输入格式
仅一行,一个正整数,表示待分解的质因数
输出格式
仅一行,从小到大依次输出其质因数,相邻的数用空格隔开
样例输入
100
样例输出
2 2 5 5
数据规模和约定
n<=2147483647
解题思路:(优化前)
找某个数的质因数,先将这个数之前的所有质数找出来(可以找到这个数的开根号之前为止),再从这些质数中找到能被整除的质数,这些质数就是符合解。
java代码:
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
if(findPrimeNum(n)) {//当n为素数时,直接输出n
System.out.println(n);
System.exit(0);
}
ArrayList<Integer> prime = new ArrayList<>();
for(int i = 0; i <= (int)Math.sqrt(n); i++) {//将根号n之前的素数打表
if(findPrimeNum(i)) {
prime.add(i);
}
}
List<Integer> ans = new ArrayList<>();
boolean flag = true;
while(flag) {
for(int i = 1; i < prime.size(); i++) {
if(n % prime.get(i) == 0) {
ans.add(prime.get(i));
n /= prime.get(i);
break;//每找到一个因子时退出循环
}
}
if(findPrimeNum(n)) {//当n为素数时退出while循环
flag = false;
ans.add(n);
}
}
Collections.sort(ans);
for(int data : ans) {
System.out.print(data + " ");
}
}
//判断m是否为素数
public static boolean findPrimeNum(int m) {
if(m == 1)return false;
for(int i = 2; i <= (int)Math.sqrt(m); i++) {
if(m % i == 0)return false;
}
return true;
}
}
提交截图:
解题思路:(优化后)
不需要打表找素数,直接从2依次往后找可以被n整除的数,这些数就是符合解。
java代码:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
scan.close();
StringBuilder ans = new StringBuilder();
for(int i = 2; i <= (int)Math.sqrt(n); i++) {
if(n % i == 0) {
n /= i;
ans.append(i + " ");
i = 1;
}
}
ans.append(n);
System.out.println(ans.toString().trim());
}
}
提交截图: