Description:
Count the number of prime numbers less than a non-negative number, n
References:How Many Primes Are There?
Sieve of Eratosthenes
Please use the following function to solve the problem:
int countPrimes(int n){
}
int countPrimes(int n) {
if (n == 0 || n == 1 || n == 2){
return 0;
}
if (n == 3){
return 1;
}
int temp = 0;
bool flag = false;
int arr[200] = { '\0' };
int k = 0;
arr[0] = 2;
for (int i = 3; i < n; i++){
for (int j = 0; j <= k; j++){
if (i%arr[j] == 0){
flag = true;
break;
}
}
if (flag == false){
if (k < 199){
k++;
arr[k] = i;
i++;
}
temp++;
}
else{
flag = false;
}
}
return temp+1;
}
判斷一個數是否是質數, 僅需判斷這個數是否能被比這個數小的質數整除, 若不能, 就是質數.
int countPrimes(int n) {
//題目要求輸入的測試值是非負數,所以必須包含0,1的特殊情況
//由於2的結果也是0,所以也包含了進去
if (n == 0 || n == 1 || n == 2){
return 0;
}
//為了方便後面的算法設計,要單獨把3拿出來
if (n == 3){
return 1;
}
int temp = 0;//定義一個計數器,用來記有多少個質數
bool flag = false;//標記,用來判斷該數是否是質數
int arr[200] = { '\0' };//最為基數的質數的量的最大值設置為200,可以測試10的6次方量級
int k = 0;//用來計數質數的個數的,也就是arr的下標
arr[0] = 2;//第一個質數賦值為2
for (int i = 3; i < n; i++){ //這個循環符合n>=4的情況,遍歷所有小於n的數,一一進行檢測
for (int j = 0; j <= k; j++){ //如果這個數能被arr[0]~arr[k]整除,說明它不是質數,flag變為true
if (i%arr[j] == 0){
flag = true;
break;
}
}
if (flag == false){ //如果flag沒有變成true,那麼說明它是質數
if (k < 199){ //我們要求arr質數僅需要200個,超出的不計入!
k++;
arr[k] = i; //把這個質數也加入arr數組中
i++;//一個質數被判斷為質數後,它的後面一個數字不可能是質數(除了2和3之外),所以用i++來減少對不不要數的檢測
}
temp++; //質數量+1
}
else{
flag = false; //把flag 再初始化為false,回到最初狀態,用於判斷下一個數值
}
}
return temp + 1;//+1是因為要加上 2 這個質數,上面的temp中不包括2
}
此外, 有以下解題方法供參考(由 stevenczp 提供):
int countPrimes(int n) {
bool* map = (bool*)malloc(n * sizeof(bool));
memset(map, 0, n * sizeof(bool));
for (int i = 2; i <= sqrt(n); i++)
{
if (map[i])
continue;
int t = 2 * i;
while (t < n)
{
map[t] = true;
t += i;
}
}
int result = 0;
for (int i = 2; i < n; i++)
{
if (!map[i])
result++;
}
return result;
}
關於本題的詳細解題過程, 請點擊這裡:
解決一道leetcode算法題的曲折過程及引發的思考