做了一道输出第n(1≤n≤10000)个素数的算法题,采用的是素数筛法。但不是很明白为什么下面代码中mark[]的长度在40001还可以正常运行,改到50000、100000或以上就崩溃了。代码如下:
#include <stdio.h>
#include <stdbool.h>
int prime[10001]; // 保存筛得的素数
int primeSize; // 保存素数的个数
bool mark[40001]; // 若mark[x]为true,则表示该数x已被标记成非素数
void init() {
for (int i = 1; i <= 40000; i++) {
mark[i] = false;
}
primeSize = 0;
for (int i = 2; i <= 40000; i++) {
if (mark[i]) continue;
prime[primeSize++] = i;
for (int j = i * i; j <= 40000; j += i) { // i*i之前的已经被标记
mark[j] = true;
}
}
printf("%d\n", primeSize);
}
int main() {
init();
int n;
while (scanf("%d", &n) != EOF) {
printf("%d\n", prime[n - 1]);
}
return 0;
}
如果是开的数组太大了,那这段程序也可以运行啊。希望有人解答一下,谢谢!
#include <stdio.h>
int a[1000000];
int main() {
a[999999] = 3;
printf("%d\n", a[999999]);
return 0;
}