我试图找到我可以拥有的素数,直到最大的两个产品超过Long.MAX_VALUE。
这需要超过半小时(和GB的RAM)
public class Main {
public static void main(String[] args) {
ArrayList <Long> primes= new ArrayList<Long>();
primes.add(2L);
long i=3L;
// Looping from 3, to the limit
while (primes.size()<2||(primes.get(primes.size()-1)*primes.get(primes.size()-2)<Long.MAX_VALUE)) {
boolean isPrime = true;
long maxDiv =Math.round(Math.sqrt(i));
int j=0;
while(primes.get(j)<maxDiv && isPrime) {
if (i % primes.get(j) == 0) {
isPrime = false;
}
j++;
}
if (isPrime) {
primes.add(i);
System.out.println(i);
}
i=i+2;
}
System.out.println("max size is: "+primes.size());
}
}
修改
我也对达到此限制之前获得的素数感兴趣。因此,自上而下的方法无法完成这项工作。
无论如何,我意识到我能够在我的应用程序中找到这两个数字,在此期间我会变得富裕起来:)
答案 0 :(得分:1)
应该有更快的方法来做到这一点。请考虑以下事项:
2
和Sqrt(Long.MAX_VALUE)
之间的数字next
)之后找到下一个素数(last
)。next*last
已经大于Long.MAX_VALUE
您已完成。next
之后的下一个黄金编号(让我们称之为next2
)next*next2
大于Long.MAX_VALUE
Eratosthenes的筛子时间复杂度为O(n*log(log(n))
。
你只需要蛮力&#34; 2个大于Sqrt(Long.MAX_VALUE)
的素数。加上计算筛子所需的时间,这应该比你的方法快得多!
至于你必须计算素数:
计算筛子时,很容易计算质数的数量!