我在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);
}
}
答案 0 :(得分:9)
你在堆栈中分配一个巨大的数组:
int prime[2000000]={};
四个字节乘以两百万等于八兆字节,这通常是最大堆栈大小。分配更多会导致分段错误。
您应该在堆中分配数组,而不是:
int *prime;
prime = malloc(2000000 * sizeof(int));
if(!prime) {
/* not enough memory */
}
/* ... use prime ... */
free(prime);
答案 1 :(得分:0)
这是我的实现方式。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int* sieve(int n) {
int* A = calloc(n, sizeof(int));
for(int i = 2; i < (int) sqrt(n); i++) {
if (!A[i]) {
for (int j = i*i; j < n; j+=i) {
A[j] = 1;
}
}
}
return A;
}
我将它作为i5 Kaby Lake上前1,000,000,000个数字的基准。
time ./sieve 1000000000
./sieve 1000000000 16.21s user 1.05s system 99% cpu 17.434 total
我只是翻译了维基百科上的this伪代码。
答案 2 :(得分:0)
这是我的实现(Java) 简单得多,因为您实际上只需要一个数组,只需从2开始循环即可。
编辑:@cheesehead的解决方案可能更好,我只是阅读了筛子的描述,并认为这将是一个很好的思想练习。
// set max;
int max = 100000000;
// logic
boolean[] marked = new boolean[max]; // all start as false
for (int k = 2; k < max;) {
for (int g = k * 2; g < max; g += k) {
marked[g] = true;
}
k++;
while (k < max && marked[k]) {
k++;
}
}
//print
for (int k = 2; k < max; k++) {
if (!marked[k]) {
System.out.println(k);
}
}
答案 3 :(得分:-1)
埃拉托色尼筛法的简单实现
方法: 我创建了一个大小为 n+1(比如 n=9 然后是 0 到 9)的布尔向量,它在所有地方都成立。现在,for i=2 将 2 的倍数的所有位置标记为 false(如 n=9 时的 4,6 和 8) .对于i=3,将所有3 的倍数的位置标记为false(如 n=9 时的 6 和 9)。现在,对于 i=4 条件 i*i<=n 是 false 因为 4*4 =16 > 9。所以,现在打印所有具有真正价值的地方。
void sieve(int n)
{
vector<bool> isPrime(n+1,true);
for(int i=2;i*i<=n;i++){
if(isPrime[i])
{
for(int j=2*i;j<=n;j=j+i)
isPrime[j]=false;
}
}
for(int i=2;i<=n;i++){
if(isPrime[i])
cout<<i<<" ";
}
}