筛选法求素数
來自:【數(shù)據(jù)結(jié)構(gòu)與算法分析——C語言描述】練習(xí)2.14
問題描述:Eratosthenes篩是一種用于計(jì)算小于N的所有素?cái)?shù)的方法。我們從制作整數(shù)2到N的表開始。我們找出最小的未被刪除的整數(shù)i,打印i,然后刪除i, 2i, 3i, ..., 當(dāng)i > √N(yùn)時,算法終止。
首先,沒必要做2到N的表,在一個循環(huán)內(nèi)遍歷2到N即可。
其次,所謂最小也沒必要判斷,依次遍歷時整數(shù)i自然是它到最后一個數(shù)之間的最小值。
最后,整數(shù)i是否被刪除等價于整數(shù)i是否素?cái)?shù)flag[i]==1或0表示,1表示素?cái)?shù),0表示非素?cái)?shù)。
思路:如果整數(shù)i是素?cái)?shù),打印它,然后刪除它的倍數(shù)。i==2時刪除2的倍數(shù),等于3時刪除3的倍數(shù),等于5時刪除5的倍數(shù),... ,直到N為止。
void Eratosthenes(int N)
{
char * flag;
int i, j;
flag = (char *)malloc(sizeof(char)*N);
memset(flag, '1', sizeof(char)*N);
for (i = 2; i < N; i++)
{
if (flag[i] == '1')
{
printf("%d ", i);
for (j = 2; j*i < N; j++) //刪除素?cái)?shù)i的倍數(shù)
flag[j*i] = '0';
}
}
free(flag);
}
測試結(jié)果:
其中數(shù)據(jù)IO花費(fèi)了不少的時間。
這是篩選法最簡單的思路之一,還可以繼續(xù)優(yōu)化,比如:因?yàn)槌?所有的偶數(shù)都不是素?cái)?shù),所以可以排除一半的數(shù)據(jù)量。也可以對外層循環(huán)只遍歷到根號N,可以減小循環(huán)的規(guī)模。
總結(jié)
- 上一篇: 花呗分期上征信报告吗 花呗分期会不会上征
- 下一篇: 文献记录(part69)--公平性机器学