如何解决数字 600851475143(Java) 的最大质因数是多少?我的错误是什么?
代码对于 int 数据类型工作正常,但 600851475143 似乎是一个太大的数字。我怎样才能让它工作?它一直在运行,从不给我答案。
public class Main {
public static void main(String[] args) {
long a = 600851475143L;
boolean prime = false;
long big = 0L;
for (long i = 1L; i < a; i++){
if (a % i == 0){
for (int j = 2; j < i/(float)2; j++){
if (i % j == 0){
prime = true;
break;
}
}
if(!prime){
big = i;
}
}
}
System.out.println(big);
}
}
解决方法
您还需要对 long
使用 j
。
你的变量命名也有点误导:当数字不是素数时,prime
为真...
你的代码有很多问题。我的第一个建议是使用命名良好的变量编写干净简洁的代码。其次,分析程序的运行时复杂性,即使它对于大量输入运行速度很快。您在 if(a % i == 0)
条件内运行内部循环这一事实使您的程序效率极低。
在这里,我提供了一个重构版本的代码,其中考虑了运行时复杂性和良好的变量名称:
public static void main(String[] args) {
System.out.println(largestPrimeFactorOf(600851475143L));
}
public static long largestPrimeFactorOf(long input)
{
List<Long> factors = new ArrayList<>();
// You start from 2,as 1 is not a prime number and also using 1 will cause an infinite loop
for (long i = 2L; i < input; i++) {
if (input % i == 0) {
factors.add(i);
while (input % i == 0) {
input /= i;
}
}
}
// As we always add a bigger number to the factor list,the last element is the greatest factor.
return factors.get(factors.size() - 1);
}
表示当输入是一个很大的素数时,这个程序仍然会很慢,例如100000000019. 为了有效地处理这种情况,最好使用有效的素性测试算法。你可以在网上搜索。 https://en.wikipedia.org/wiki/Primality_test
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。