【发布时间】:2011-12-16 19:30:33
【问题描述】:
我在解决Project Euler 上的问题时阅读了 Eratosthenes 的筛子。我相信你们知道我在说哪个问题。 事情就是这样。我的代码设法正确显示了 100 万以下的所有素数。 但是,当我为 200 万个尝试相同的实现时,它给了我一个分段错误...... 我对错误出现的原因有一定的了解,但不知道如何纠正它...... 这是 100 万以下素数的代码。
#include<stdio.h>
int main(void)
{
int i,k=2;
int j;
int n=1000000;
int prime[2000000]={};
for(i=0;i<n;i++) // initializes the prime number array
{
prime[i]=i;
}
for(i=2;i<n;i++) // Implementation of the Sieve
{
if(prime[i]!=0)
{
for(j=2;j<n;j++)
{
{
prime[j*prime[i]]=0;
if(prime[i]*j>n)
break;
}
}
}
}
for(i=0;i<n;i++) // Prints the prime numbers
if(prime[i]!=0)
{
printf("%d\n"prime[i]);
}
return(0);
}
}
【问题讨论】:
-
你把
int n=1000000;改成int n=2000000;了吗 -
这看起来像是一个可能越界的数组访问:
prime[j*prime[i]]=0。 -
附带说明,您可能应该使用
int以外的其他数据类型。不保证 Int 是任何特定大小,除了 16 位。作为一个风格问题,我建议long用于 32k 以上的数字。 -
如果他要索引一个大数组,他不妨使用
size_t
标签: c sieve-of-eratosthenes sieve