そのため、私は自分のことをかなり初心者のプログラマーと呼んでいます。学校教育では主にハードウェアに集中しており、コンピューター サイエンスのコースはあまり多くありませんでした。
そこで、Project Euler の問題 7 を解決しました。
最初の 6 つの素数 (2、3、5、7、11、13) をリストすると、6 番目の素数が 13 であることがわかります。
10001番目の素数は何ですか?
Javaで問題なくこれを解決できましたが、ソリューションを実行すると、実行に8秒かかりました。数学的な観点ではなく、プログラミングの観点からこれをどのように最適化できるか疑問に思っていました。
配列がループしているか、主に while ステートメントが処理時間を消費していますか? そして、これをどのように最適化できますか? 繰り返しますが、派手な数式を探しているわけではありません..ソリューションスレッドにはそれらがたくさんあります.
スポイラー私の解決策を以下に示します。
public class PrimeNumberList {
private ArrayList<BigInteger> primesList = new ArrayList<BigInteger>();
public void fillList(int numberOfPrimes) {
primesList.add(new BigInteger("2"));
primesList.add(new BigInteger("3"));
while (primesList.size() < numberOfPrimes){
getNextPrime();
}
}
private void getNextPrime() {
BigInteger lastPrime = primesList.get(primesList.size()-1);
BigInteger currentTestNumber = lastPrime;
BigInteger modulusResult;
boolean prime = false;
while(!prime){
prime = true;
currentTestNumber = currentTestNumber.add(new BigInteger("2"));
for (BigInteger bi : primesList){
modulusResult = currentTestNumber.mod(bi);
if (modulusResult.equals(BigInteger.ZERO)){
prime = false;
break;
}
}
if(prime){
primesList.add(currentTestNumber);
}
}
}
public BigInteger get(int primeTerm) {
return primesList.get(primeTerm - 1);
}
}