static public int CountPrimes(int n)
{
//buf 存放所有數(shù)據(jù),默認(rèn)全部為素數(shù)
bool[] buf = new bool[n];

//primeBuf 存放素數(shù),這是有序的,從小到大。
int[] primeBuf = new int[n];

//標(biāo)記已存放多少個素數(shù)
int primeSize = 0;


//從第一個素數(shù)開始
for (int i = 2; i < n; i++)
{
//識別為素數(shù)
if(!buf[i])
{
//將素數(shù)存放進數(shù)組中
primeBuf[primeSize] = i;
//標(biāo)記數(shù)增加
primeSize++;
}

//遍歷存放素數(shù)的數(shù)組
//j 少于 primeBuf下標(biāo)的最大值 且不能超出 用來存放所有數(shù)據(jù)的 buf 的范圍
for (int j = 0; j < primeSize && i*primeBuf[j] {
//數(shù)字“i * primeBuf[j]”為合數(shù),因為能被素數(shù)i整除
buf[i * primeBuf[j]] = true;

//下面這段是重點:防止冗余(去掉重復(fù)部分)。如12 可由2 * 6 或 3 * 4 所得 ,我們只取最小素因子即可
//假設(shè)整數(shù)X為另一個乘數(shù)
//由 i = primeBuf[j] * X
// i * primeBuf[j+1] = primeBuf[j] * (X * primeBuf[j+1]) 如12 = 2*6 = 2*2*3 下面我們break排除了2*2*3
// (X * primeBuf[j+1])是一個正整數(shù)
// 所以,若i能被primeBuf整除
// i * primeBuf[j+1] 也能被 primeBuf[j] 整除
if (i%primeBuf[j]==0)
{
break;
}
}
}

return primeSize;
}