今天看到一篇博文,讲的的改进筛素数法,地址如下
http://blog.csdn.net/morewindows/article/details/7347459
其中有一些地方想了很久才明白,写文记载下来。
第一次改进:比如10,我们要访问2*5,也要访问5*2,所以需要改进,我们只需访问5*2即可。
const int MAXN = 100; bool flag[MAXN]; int primes[MAXN / 3], pi; void GetPrime_2() { int i, j; pi = 0; memset(flag, false, sizeof(flag)); for (i = 2; i < MAXN; i++) { if (!flag[i]) primes[pi++] = i; for (j = 0; (j < pi) && (i * primes[j] < MAXN); j++) flag[i * primes[j]] = true; } }
第二次改进,比如12,我们要访问4*3,也要访问6*2,还是需要改进,我们选择6*2,因为2是12的最小素因子。但是我们怎么判断一个数要不要访问呢?比如4*3,由于4=2*2,所以4*3肯定能分解为2*2*3,即变为6*2,那我们就等到6*2的时候再访问。代码如下
const int MAXN = 100; bool flag[MAXN]; int primes[MAXN / 3], pi; void GetPrime_2() { int i, j; pi = 0; memset(flag, false, sizeof(flag)); for (i = 2; i < MAXN; i++) { if (!flag[i]) primes[pi++] = i; for (j = 0; (j < pi) && (i * primes[j] < MAXN); j++) { flag[i * primes[j]] = true; if (i % primes[j] == 0) //这句保证每个非素数只被筛去一次 break; } } }