题目:
难点:
第10001个素数的范围估算不会超过20万
如何写出运行速度更快的代码
方法:
#include <stdio.h>
#include <math.h>
#define MAX_N 10001
int is_prime(int a) {
for (int i = 2, I = sqrt(a); i <= I; i++) {
//初始化I = sqrt(a)提高效率
if (a % i == 0) return 0;
}
return 1;
}
int main() {
int n = 0;
for (int i = 2; i < 200000; i++) {
if (!is_prime(i)) continue;
n += 1;
if (n == MAX_N) {
printf("%d\n", i);
break;
}
}
return 0;
}
最易懂且最慢的方法,每个数字都进行判断
代码优化:
优化1:
#include <stdio.h>
#define MAX_N 200000
int prime[MAX_N + 5] = {0};
void init_prime() {
for (int i = 2, I = MAX_N; i <= I; i++) {
if (prime[i]) continue;
prime[++prime[0]] = i;
for (int j = 2; j <= MAX_N / i; j++) {
prime[i * j] = 1;
}
}
return ;
}
int main(){
init_prime();
printf("%d\n", prime[10001]);
return 0;
}
利用素数筛算法,空间复杂度为O(n),时间复杂度为O(n * loglogN)
优化2:
#include <stdio.h>
#define MAX_N 200000
int prime[MAX_N + 5] = {0};
void init_prime() {
for (int i = 2; i <= MAX_N; i++) {
if (!prime[i]) prime[++prime[0]] = i;
for (int j = 1; j <= prime[0]; j++) {
if (prime[j] * i > MAX_N) break;
prime[prime[j] * i] = 1;
if (i % prime[j] == 0) break;
}
}
return ;
}
int main(){
init_prime();
printf("%d\n", prime[10001]);
return 0;
}
利用线性筛算法,空间复杂度为O(n),时间复杂度为O(n)