java计算素数因子分解的更有效方法?
我现在有一个程序来寻找一个给定数字的素因子分解;对于较小的数字来说效果很好,但对于任何超过一百万的数字来说都需要时间。我的代码效率极低,查找输入下面的所有素数,并检查哪些素数被除而没有余数。我不知道如何降低效率,有什么帮助吗
static ArrayList<Integer> primeNumbersBelow(long n) {
ArrayList<Integer> ay = new ArrayList<Integer>();
ay.add(2);
for(int i = 3; i < ((n % 2 != 0) ? (n + 1) / 2 : n / 2); i++) {
boolean divides = false;
for(int j = 2; j < i; j++) {
if(i % j == 0) {
divides = true;
}
}
if(!divides) {
ay.add(i);
System.out.println(i);
}
}
return ay;
}
static ArrayList<Integer> primeFactorisationOf() {
ArrayList<Integer> ay = new ArrayList<Integer>();
ArrayList<Integer> aay = primeNumbersBelow(input);
long n = input;
for(int i = 0, len = aay.size(); i < len; i++) {
int f = aay.get(i);
boolean run = true;
while(run) {
if(n % f == 0) {
ay.add(f);
n /= f;
} else {
run = false;
}
}
}
return ay;
}
# 1 楼答案
从Mr Lars Vogel @ vogella
# 2 楼答案
改进代码的一种方法是删除循环结构中的IO。 就是
我相信单凭这一点,你就会看到巨大的性能提升
# 3 楼答案
坚持你的通用算法,而不是重新编写
primesBelow(..)
方法:我想说:divides = true
,就可以跳出for循环Math.sqrt(n)
——我不会进行数学运算,但您可以自己查找李>