实现此功能的最佳方式是什么:
ArrayList generatePrimes(int n)
Run Code Online (Sandbox Code Playgroud)
此函数生成第一个n素数(编辑:where n>1),因此generatePrimes(5)将返回ArrayListwith {2, 3, 5, 7, 11}.(我在C#中这样做,但我很高兴Java实现 - 或任何其他类似的语言(所以不是Haskell)).
我知道怎么写这个函数,但是当我昨晚做到这一点时,它并没有像我希望的那样结束.这是我想出的:
ArrayList generatePrimes(int toGenerate)
{
ArrayList primes = new ArrayList();
primes.Add(2);
primes.Add(3);
while (primes.Count < toGenerate)
{
int nextPrime = (int)(primes[primes.Count - 1]) + 2;
while (true)
{
bool isPrime = true;
foreach (int n in primes)
{
if (nextPrime % n == 0)
{
isPrime = false;
break;
}
}
if (isPrime)
{
break;
}
else
{
nextPrime …Run Code Online (Sandbox Code Playgroud) 我试图解决这个项目欧拉问题.我实现了euler的筛子作为java中的帮助类.它适用于小数字.但是,当我输入200万作为限制时,它不会返回答案.我使用Netbeans IDE.我等了很多个小时一次,但仍然没有打印答案.当我停止运行代码时,它给出了以下结果
Java结果:2147483647
BUILD SUCCESSFUL(总时间:2,097分43秒)
这个答案是不正确的.即使等了这么多时间,这也是不正确的.虽然相同的代码返回较小限制的正确答案.
在这个页面的底部给出了一个非常简单的算法.
我的实现是这样的:
package support;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author admin
*/
public class SieveOfEuler {
int upperLimit;
List<Integer> primeNumbers;
public SieveOfEuler(int upperLimit){
this.upperLimit = upperLimit;
primeNumbers = new ArrayList<Integer>();
for(int i = 2 ; i <= upperLimit ; i++)
primeNumbers.add(i);
generatePrimes();
}
private void generatePrimes(){
int currentPrimeIndex = 0;
int currentPrime = 2;
while(currentPrime <= Math.sqrt(upperLimit)){
ArrayList<Integer> toBeRemoved = new ArrayList<Integer>();
for(int i = currentPrimeIndex ; i …Run Code Online (Sandbox Code Playgroud)