分解质因数
问题描述
将一个正整数分解质因数.
例如,输入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));
}
}