我们来考虑这样一个问题
如何对一个小于2000的正数快速的进行因式分解。
比如对12,能因式分解成哪些数呢?
我们知道,因式分解的结果,合数可以被分解为质数,质数只能被分解成1和它本身。
如果有个数组,可以记录下,该下标代表的数的最小因数就好了。
典型的以空间换时间。
质数的最小因数就是它本身(1除外)。
//下标代表是哪个数,值为该数的最小因数
int[] mini_p=new int[2000];
//2的最小因数是2
mini_p[2]=2;
//从小到大设置数的最小因数(除1以外)
for(int i=2;i<=1000;i++){
if(mini_p[i]>0){
//值大于0,则已经有最小因数被设置过了,也意味着该数是个合数
continue;
}
//没被设过最小因数,那这个数是一个质数
for(int j=i;j<=1000;j=j+i){
//将该值及以后,没有设立过最小因数的,最小因数都设为该值
if(mini_p[j]>0){
continue;
} else {
mini_p[j]=i;
}
}
}
对值n进行因数分解
public List<Integer> decompose(int n){
List<Integer> res=new ArrayList();
//对1还是不分解了吧
if(n<2) return null;
int[] mini_p=new int[2000];
//这里调用上面对mini_p的初始化
while(n!=1&&n!=0){
res.add(mini_p[n]);
n=n/mini_p[n];
}
return res;
}