Description:
Count the number of prime numbers less than a non-negative number, n.
計算比N小的所有質數的個數
這道題花了好多時間,數學真實博大精深 ·.·
- 懵懂無知的我最開始是知道暴力求解是行不通的,然後發現第一種解法:把要除的所有比N小的數,變成了sqrt(n),直接少了一半,然後感慨了一番,結果。。。。這盡然是最最基礎的解法,並且LEETCODE中還超時!!
#include <iostream>
#include <math.h>
using namespace std;
bool prime (int n)
{
int s=sqrt(n);
for(int i=2; i<=s; i++)
{
if(n%i==0)
return false;
return true;
}
}
int main()
{
int n;
while(true)
{
cin>>n;
cout<<prime(n)<<endl;
}
}
- 然後繼續尋找,有很 多種解法,這裏只寫我理解的一種:
- 配合這個神圖
解法都在圖中:
首先計算2的倍數並標記,然後計算3……一直到sqrt(n),最後輸出未被標記的數,就是質數了。
我用的vector<int>
來保存數組,0代表未標記,1代表標記,最開始想的用vector<bool>
來保存,沒想到這是個Bug ,長知識了
還要注意的一點是初始化數組後,要減去第一位0和第二位1這倆位數
class Solution {
public:
int countPrimes(int n)
{
if(n<2)
return 0;
vector<int> v(n,0);
int k=n-2;
for(int i=2; i<sqrt(n); i++)
{
for(int j=i; i*j<n; j++)
{
if(v[i*j]==0)
{
k--; //計算一共有多少質數
v[i*j]=1; //標記不能不寫,不然會有重複
}
}
}
return k;
}
};