我有这段代码可以找到数字600851475143
的最大素数因子:
BigInteger tal = new BigInteger("600851475143");
BigInteger tempBiggest = new BigInteger("2");
BigInteger temp = new BigInteger("2");
boolean check = true;
for (BigInteger I = new BigInteger("2"); I.compareTo(tal) < 0; I = I.add(BigInteger.ONE)) {
if (tal.mod(I).equals(BigInteger.ZERO)) {
temp = I;
if (temp.mod(new BigInteger("2")).equals(BigInteger.ZERO)) {
check = false;
} else {
for (BigInteger t = new BigInteger("2"); t.compareTo(temp) < 0; t = t.add(BigInteger.ONE)) {
if (temp.mod(t).equals(BigInteger.ZERO)) {
check = false;
break;
}
}
if (check) {
tempBiggest = I;
}
check = true;
}
}
}
System.out.println(tempBiggest);
System.exit(0);
该代码适用于较小的数字,但不适用于较大的数字。有没有办法简化这个或者我的整个代码是否错误构建?
答案 0 :(得分:2)
这使我的平均电脑低于700毫安:
public static void main(String[] args) {
long tal = 600851475143L;
int i;
for (i = 2; i <= tal; i++) {
if (tal % i == 0) {
tal /= i; i--;
}
}
System.out.println("largest prime factor is " + i); // largest prime factor is 6857
}
答案 1 :(得分:0)
首先,仅循环到mod(2)
。
其次,您可以跳过偶数,所以只需检查mod(3)
然后检查mod(5)
,mod()
等。
第三,在运行期间,您可以构建成功测试的素数列表,然后仅检查该列表中的项目check
。这将节省大量时间,你可能会忘记第二点。
最后但并非最不重要 - true
变量非常混乱,而是将其移动到内部块中,始终初始化为if
并忘记下一个周期的最后一次更新。
答案 2 :(得分:0)
最大的素数因子可以是最多sqrt(num)。所以最好从那开始然后下降而不是上升。这样,只要你有一个因素,你就完成了。
BigInteger sqrt = getApproxSquareRoot(num);
for (BigInteger t = sqrt; t.compareTo(2) > 0; t = t.add(BigInteger.ONE)) {
// if t divides num then you found it.
}
答案 3 :(得分:0)
您的代码是正确的,但您可以更改某些内容以使其快速运行。
例如,在第一个周期中,仅向i
添加一个是没用的,因为您正在考虑每两个步骤为2的倍数。此外,您可以检查i.compareTo(sqrt(tal)) < 0;
以避免其他无用的循环。
此外,我会想到一种不使用check
的方法。