我正在编写一个计算大数的最大素数因子的Java程序。但是我有一个关于程序复杂性的问题,我不知道是什么导致程序永远无法运行大量数据,它可以在少数情况下正常工作。Java程序永远以大数运行
我已经着手如下:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
public class Largest_prime_factor {
public static void main(String[] args)
{
//ArrayList primesArray = new ArrayList();
ArrayList factorArray = new ArrayList();
long largest = 1;
long number = 600851475143L ;
long i, j, k;
//the array list factorArray will have all factors of number
for (i = 2; i < number; i++)
{
if(number % i == 0)
{
factorArray.add(i);
}
}
这里,数组列表将有号码的所有因素。 因此,我只需要获取主要数据,为此,我使用了一种方法来检查数字是否为素数,如果它不是素数,则使用以下方法将其从列表中删除:
java.util.ArrayList.remove()
因此,代码的下一个部分是如下:
for (i = 2; i < number; i++)
{
if (!isPrime(i))
{
factorArray.remove(i);
System.out.println(factorArray);
}
}
System.out.println(Collections.max(factorArray));
}
最后一行打印factorArray,这正是我要寻找的数量最多。
public static boolean isPrime(long n)
{
if(n > 2 && (n & 1) == 0)
return false;
for(int i = 3; i * i <= n; i += 2)
if (n % i == 0)
return false;
return true;
}
}
上面的函数是我用来确定数字是否为素数,然后再将它从列表中移除的函数。
这个程序完美适用于小数字,但是尽管最后一个函数非常快,但它需要永远给出大数目的输出。 起初,我用来检查一个数字是否为素数或不在第一个循环内,但它更慢。
也许这更像是一个内存问题,因为你似乎把整数放入列表中。你有没有检查你的记忆是如何演变的?和GC活动? –
嗯,600851475143是一个非常大的数字。如果你的“较小的数字”是600851475(它本身已经是一个非常大的数字),那么对于较大的数字至少要花1000倍。你期望什么? –
你的算法必须是O(N)或者更糟,O(N^2) – duffymo