【统计质数】
カウント未満の非負数より素数の数、N。
例:
入力:10
出力:4
説明:10未満4つの素数がありますが、彼らは2、3、5、7です。
思考
n個の範囲内のすべての番号をマークするために、最初のブール配列のnotPrimeを確立することは素数である、それが素数ならば、偽としてラベル付けされなければならない、非素数は真としてマークされます。
最初は、すべてのフラグはfalseです。
外側のループ:2からnまで私トラバース、(偽としてマーク)が見つかった場合、素数、数++。
内部ループ:外側のループはtrueにすべてのセットのための私の倍数です。
サイクルの後にすべての数字は、非プロトン真としてマークされています。すべての素数がカウントされます。
コード
public class Solution {
public int countPrimes(int n) {
boolean[] notPrime = new boolean[n];//初始为false
int count = 0;
for (int i = 2; i < n; i++) {
if (notPrime[i] == false) {//false表示该数为质数
count++;
for (int j = 2; i*j < n; j++) {
notPrime[i*j] = true;//将i的所有倍数置为true,也就是非质数
}
}
}
return count;
}
}
結果を発表
ランタイム:12ミリ秒、カウント素数のためのJavaのオンライン提出の高速化よりも80.90パーセント。
メモリ使用率:33.1メガバイト、カウント素数のためのJavaのオンライン提出未満の100.00パーセント。
改善します
上記のコードは、さらに効率を改善するために修飾することができます。
(2除く)偶数番号のすべてが素数であることができないので、Nの範囲で、必要にのみ、すべての奇数を検出するため。
私たちは、より速く多くのことを実行し、その結果から見ることができます。
コード
public class Solution {
public int countPrimes(int n) {
if (n < 3)
return 0;
boolean[] notPrime = new boolean[n];
int count = 0;
for (int i = 3; i < n; i += 2) {//遍历所有的奇数
if (notPrime[i] == false) {
count++;
for (int j = 3; i*j < n; j+=2) {//对其倍数(的标记)操作也只是操作所有的奇数
notPrime[i*j] = true;
}
}
}
return count+1;//没有把2算进去,所有+1
}
}
結果を発表
ランタイム:7ミリ、カウント素数のためのJavaのオンライン提出の高速化よりも98.28パーセント。
メモリ使用率:33.1メガバイト、カウント素数のためのJavaのオンライン提出未満の100.00パーセント。