【发布时间】:2015-07-07 15:57:33
【问题描述】:
我正在尝试解决Spoj 上的 PRIME1 问题。我使用 Eratosthenes 的分段筛实现了这段代码
#include <stdio.h>
long int primes[100000];
int main(void) {
long int t, m, n, i, j, p;
scanf("%ld",&t);
while(t--) {
scanf("%ld",&m);
scanf("%ld",&n);
for(i=2; i*i<=n; i++) {
p=m/i;
p=p*i;
for(j=p; j<=n; j+=i) {
if(j!=i)
primes[j-m] = 1;
}
}
for(i=0; i<(n-m+1); i++) {
if(primes[i] == 0)
printf("%ld ",i+m);
else
continue;
}
printf("\n");
}
return 0;
}
当n-m 的值不是很高时,它可以正常工作。但是,如果n-m 的值变得非常高(即接近 100000),则会出现分段错误。为什么会有这种行为?
另外,当我在 main 中声明素数数组时,代码可以正常工作。
#include <stdio.h>
int main(void) {
long int t, m, n, i, j, p;
scanf("%ld",&t);
while(t--) {
scanf("%ld",&m);
scanf("%ld",&n);
if(m==1) m=2;
long int primes[n-m+1];
for(i=0;i<n-m+1;i++)
primes[i]=0;
for(i=2; i*i<=n; i++) {
p=m/i;
p=p*i;
for(j=p; j<=n; j+=i) {
if(j!=i)
primes[j-m] = 1;
}
}
for(i=0; i<(n-m+1); i++) {
if(primes[i] == 0)
printf("%ld ",i+m);
else
continue;
}
printf("\n");
}
return 0;
}
为什么当我全局声明素数数组时程序会出现分段错误?
【问题讨论】:
-
也许你超出了数组的范围?或者您可能需要
unsigned long long(long可能只有 32 位并且您正在溢出)? -
n-mmax = 100000,i<(n-m+1):imax =n-m但primes[100000];所以primes[i]=0;(primes[100000] = 1) 超出范围。 -
当用户运行程序时,他们会留下一个闪烁的光标,并且不知道他们应该输入什么。 Suggest:提示用户输入三个输入值中的每一个。始终检查 scanf() 的返回值以确保操作成功
-
@user3629249 该程序适用于 SPOJ。
-
感谢@BLUEPIXY。它非常有帮助。
标签: c arrays segmentation-fault