只需要判断 n 能够被 2, 3, ···, n - 1 整除,就可以判断 n 是否为素数。该算法的时间复杂度为 o(n) 。
2.更快思路
若 2 ~ n - 1 中存在 n 的约数 k ,有 n % k == 0 ,假设 n / k = m ,则一定有 n % m == 0 。即若 n 有约数,则其约数一定是成对出现的,且一个 >= sqrt(n) ,另一个 <= sqrt(n) ,其中 sqtr(n) 为根号 n 。
因此,只需要判断 n 能否被 2, 3, ···, sqrt(n) 整除,即可判断 n 是否为素数。该算法的时间复杂度为 o(sqrt(n)) 。
代码如下:
1 2 3 4 5 6 7 8
boolisPrime(int n){ int i; if (n <= 1) returnfalse; int sqr = (int)sqrt(1.0 * n); for (i = 2; i <= sqr; i++) if (n % i == 0) returnfalse; returntrue; }
sqrt 的作用为给浮点数开根号,需要添加 math.h 头文件,由于 sqrt 的参数要求为浮点数,因此在 n 前面乘以 1.0 使其成为浮点型。
若 n 的数字较小,有简单写法:
1 2 3 4 5 6 7
boolisPrime(int n){ int i; if (n <= 1) returnfalse; for (i = 2; i * i <= n; i++) if (n % i == 0) returnfalse; returntrue; }
二、素数表的获取
1.简单思路
从 1 ~ n 进行枚举,判断每一个数是否为素数,如果是素数则加入素数表。这种方法枚举部分的复杂度为 o(n) ,而对每个数字判断素数的复杂度为 o(n0.5) ,因此总复杂度为 o(n1.5) 。这个复杂度对于 n 不超过 105 的大小是没有问题的。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
constint maxn = 101; int prime[maxn]; //存放素数 int pnum = 0; //素数个数及数组下标 bool p[maxn] = {0}; //p[i] == true 表示i是素数
boolisprime(int n); //判断是否为素数
voidFindPrime(){ int i; for (i = 1; i < maxn; i++) if (isPrime(i) == true){ prime[pnum++] = i; p[i] = true; } }
boolisPrime(int n){ int i; if (n <= 1) returnfalse; int sqr = (int)sqrt(1.0 * n); for (i = 2; i <= sqr; i++) if (n % i == 0) returnfalse; returntrue; }
intmain(){ int i, j; int m, n; scanf("%d %d", &m, &n); int *prime = (int*)malloc(sizeof(int) * n); for (i = 1, j = 0; j < n; i++){ if (isPrime(i)) prime[j++] = i; } for (i = m - 1, j = 0; i < n; i++, j++){ if (j % 10 == 0 && j != 0) printf("\n"); elseif (j != 0) printf(" "); printf("%d", prime[i]); } }