分解质因数
问题描述
将一个正整数分解质因数.
例如,输入90,打印出 90=233*5
算法思路
- 首先还是构造好一个素数表 prime_list
- 遍历prime_list,从小到大开始寻找即是n约数,找到就加入到res这个列表,n/这个素数,在从头开始遍历prime_list
代码示例
Python
pt_list = [True] * 1000 # 筛表 prime_list = [] # 素数表 def isPrime(n): if not pt_list[n]: return False prime_list.append(n) for idx in range(n ** 2, len(pt_list), n): pt_list[idx] = False return True def resolvePrime(n): res = [] while True: for x in prime_list: if n % x == 0 and x < n: res.append(x) n //= x break elif x == n: res.append(x) return res # 构建好prime_list for x in range(2, 1000): isPrime(x) print(resolvePrime(90))
Java
import java.util.ArrayList; import java.util.List; public class 分解质因数 { static List<Integer> prime_list; // 素数表 static boolean[] pt_arr; // 筛表 static void init() { pt_arr = new boolean[1000]; prime_list = new ArrayList<Integer>(); for (int i = 0; i < pt_arr.length; i++) { pt_arr[i] = true; } // 构造素数表 prime_list for (int i = 2; i < 1000; i++) { if (isPrime(i)) { prime_list.add(i); } } } static boolean isPrime(int n) { if (!pt_arr[n]) { return false; } for (int i = n * n; i < pt_arr.length; i += n) { pt_arr[i] = false; } return true; } static List<Integer> resolvePrime(int n) { List<Integer> res = new ArrayList<Integer>(); while (true) { for (Integer x : prime_list) { if (n % x == 0 && x < n) { res.add(x); n /= x; break; } else if (x == n) { res.add(x); return res; } } } } public static void main(String[] args) { // 初始化 init(); System.out.println(resolvePrime(90)); } }