Java 为初学者构建素数数组的更有效方法

Java 为初学者构建素数数组的更有效方法,java,performance,Java,Performance,早上好。我刚刚完成了JAVA的第一门课程,正在网上寻找项目,为夏天保持新鲜感。我无意中发现了Euler项目的网站,正在尝试完成问题10。我写这个算法是为了建立一个素数数组,它适用于集合中以前的问题。但是,当我尝试运行numberOfPrimes=100000或更大时,需要几分钟 我假设有一种更有效的方法,尽管我可能没有理解它的技能。无论哪种方式,我都希望得到任何建议 int[] arrayOfPrimes = new int[numberOfPrimes]; ar

早上好。我刚刚完成了JAVA的第一门课程,正在网上寻找项目,为夏天保持新鲜感。我无意中发现了Euler项目的网站,正在尝试完成问题10。我写这个算法是为了建立一个素数数组,它适用于集合中以前的问题。但是,当我尝试运行numberOfPrimes=100000或更大时,需要几分钟

我假设有一种更有效的方法,尽管我可能没有理解它的技能。无论哪种方式,我都希望得到任何建议

        int[] arrayOfPrimes = new int[numberOfPrimes];
        arrayOfPrimes[0] = 2;


        for(int i = 1; i < numberOfPrimes; i++)
        {
            int n = arrayOfPrimes[(i - 1)] + 1;


            for(int j = 0; j < i; j++)
            {
                if(n % arrayOfPrimes[j] == 0)
                {
                    n++;
                    j = -1; //resets to 0 at the next iteration.
                }
            }

            arrayOfPrimes[i] = n;
        }
int[]arrayOfPrimes=新的int[numberOfPrimes];
arrayOfPrimes[0]=2;
for(int i=1;i
您可以检查您试图使用的素数
n
是否大于
n
的平方根。那会让你活到10万

然而,目前还没有获得任意大的连续素数数组的方法

这是修改后的代码

int numberOfPrimes = 100000;
int[] prime = new int[numberOfPrimes];
prime[0] = 2;

for (int i = 1; i < numberOfPrimes; i++) {
    int n = prime[(i - 1)] + 1;

    int sqrtN = (int)(Math.sqrt(n)) + 1;

    for (int j = 0; j < i && prime[j] < sqrtN; j++) {
        if (n % prime[j] == 0) {
            n++;
            j = -1; // resets to 0 at the next iteration.
        }
    }

    prime[i] = n;
}
int numberOfPrimes=100000;
int[]素数=新的int[numberOfPrimes];
素数[0]=2;
for(int i=1;i
最好使用ArrayList,您可以更轻松地操作它,并在此处获取任意数量的数字。请尝试以下代码:-

int numberOfPrimes=100000;

ArrayList<Integer>Primes = new ArrayList<>();

Primes.add(2);

int i=3;
Primes.add(i);
for(int j = 0; j < Primes.size(); j++){//Checks all previous prime numbers before the new number
if(i%Primes.get(j)==0){//Checks if prime number at j is divisible by i

if(Primes.size()>numberOfPrimes){//breaking out of loop after reaching above numberOfPrimes 

Primes.remove(Primes.size()-1);//Removes the last non prime number 
    break;
}
Primes.remove(Primes.size()-1);//Removes the non prime number
j=-1;//resets j to start from 0
i++;//next number
Primes.add(i);//adding it for next check
}
if(j==Primes.size()-2){//Another resting condition when all previous prime numbers are checked
j=-1;
i++;
 Primes.add(i);
}
}
//end

for(int j = 0; j < Primes.size(); j++){// just for printing
System.out.println(Primes.get(j));
}
int numberOfPrimes=100000;
ArrayListPrimes=新的ArrayList();
添加(2);
int i=3;
加上(i);
对于(int j=0;jnumberOfPrimes){//达到numberOfPrimes以上后中断循环
Primes.remove(Primes.size()-1);//删除最后一个非素数
打破
}
Primes.remove(Primes.size()-1);//删除非素数
j=-1;//将j重置为从0开始
i++;//下一个数字
Primes.add(i);//为下一次检查添加它
}
如果(j==Primes.size()-2){//检查所有先前素数时的另一个静止条件
j=-1;
i++;
加上(i);
}
}
//结束
用于(int j=0;j
实现100000只需1分7秒,另一个循环用于打印阵列


别忘了插入
import java.util.ArrayList
在课程结束之前,Euler的哲学是“如果你不能解决它,你就不能解决它”。请自己读一遍。也许像埃拉托什尼筛子()或阿特金筛子()之类的东西会帮助你重新考虑你的方法。我这学期没有学习ArrayList——这篇文章让我在网上陷入了一个视频和示例的大洞。这门课似乎非常有用,我希望我能早点学会。谢谢你的帮助!