做了一道输出第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;
}
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);
}
问题出在这里,并不在你说的内存溢出,请检查j的值,int j = i * i,当i>=46349,这里的j的值越界了,j变成了负数,同样进入循环,所以,你懂了。
####请采纳,回答不易~
大概是程序有数据段,一定范围内可以给你读取或写,一旦超出这个,数据不能给你读取,然后程序就崩溃了