本文共 1595 字,大约阅读时间需要 5 分钟。
素数筛法是一种高效的算法,用于找出一定范围内的素数。它通过事先标记非素数的数字,进而快速筛选出所有的素数。这种方法在数论和密码学领域应用广泛。
MaxFactor埃氏筛法是一种经典的素数筛法实现,主要思想如下:
bool is_pri[N+5];void prime() { for (int i = 0; i <= N; i++) { is_pri[i] = true; } is_pri[0] = false; is_pri[1] = true; for (int i = 2; i <= N; i++) { if (is_pri[i]) { for (int j = 2 * i; j <= N; j += i) { is_pri[j] = false; } } }} is_pri,默认所有元素为真,表示未知是否为素数。is_pri[0]为假,is_pri[1]为真(虽然1不是素数)。is_pri[i]为真),则标记所有i的倍数为非素数。MaxFactor线式筛法是一种更高效的素数筛法,通过线性筛法优化了空间复杂度:
int pri[N+10];void prime() { memset(pri, 0, sizeof(pri)); pri[1] = 0; // 0表示素数 for (int i = 2; i <= N; i++) { if (!pri[i]) { for (int j = i * i; j <= N; j += i) { pri[j] = 1; } } }} pri,初始值均为0。pri[1]为0,表示1不是素数。pri[i]为0,说明i是素数。普通方法通过逐个检查每个数的因数来判断是否为素数:
int m, pri[max];void prime(int n) { int i, j; memset(pri, 0, sizeof(pri)); for (i = 2; i <= n; i++) { for (j = 2; j <= sqrt(i); j++) { if (i % j == 0) { break; } } if (j > sqrt(i)) { pri[m++] = i; } }} pri,用于存储找到的素数。转载地址:http://jbfe.baihongyu.com/