n
之前的质数数量a coding problem in C++。所以我首先想出了一些代码:
int countPrimes(int n) {
vector<bool> flag(n+1,1);
for(int i =2;i<n;i++)
{
if(flag[i]==1)
for(long j=i;i*j<n;j++)
flag[i*j]=0;
}
int result=0;
for(int i =2;i<n;i++)
result+=flag[i];
return result;
}
原代码执行时间为88毫秒,内存使用量为8.6 MB。然后我将代码更改为:
int countPrimes(int n) {
// vector<bool> flag(n+1,1);
bool flag[n+1] ;
fill(flag,flag+n+1,true);
for(int i =2;i<n;i++)
{
if(flag[i]==1)
for(long j=i;i*j<n;j++)
flag[i*j]=0;
}
int result=0;
for(int i =2;i<n;i++)
result+=flag[i];
return result;
}
这段代码运行时间为28毫秒,内存消耗为9.9 MB。我不太理解为什么在运行时间和内存消耗方面会有如此大的差距。我已经阅读了类似this one和that one的相关问题,但仍感到困惑。
编辑:将
vector<bool>
替换为vector<char>
后,将运行时间降低至40毫秒,内存消耗为11.5 MB。
for(int i = 2; i * i <n;i++)
,这样做可以节省一些时间,因为如果i * i >= n
,那么下一次循环将不会有任何作用。请注意,修改后的内容应保持与原文意思一致,同时更通顺易懂。 - Marek Rtrue
和false
而不是1
。所以:vector<bool> flag(n+1, true);
和if (flag[i])
。这并不影响结果,但可以让你的操作更加清晰易懂。 - Pete Becker