Eratosthenes的筛子数量超过200万[C]

时间:2017-11-29 19:01:51

标签: c function numbers sieve

我正在尝试制作一个程序,将所有素数命名为n。当我输入数字时> 200万,程序崩溃了。有人能帮助我吗?

#include <stdio.h>
#include <math.h>

void sieve(unsigned long long int n, char primes[]);

int main()
{
  unsigned long long int i, n = 2000000; // find the primes up to 500000
  char v[n];
  sieve(n, v);
  for (i=0;i<n;i++)
    if (v[i] == 1)
      printf("%I64u\n",i); // this just prints out each value if it's Prime
}

void sieve(unsigned long long int n, char primes[])
{
  unsigned long long int i, j;
  for (i=0;i<n;i++)
    primes[i]=1; // we initialize the sieve list to all 1's (True)
  primes[0]=0,primes[1]=0; // Set the first two numbers (0 and 1) to 0 (False)
  for (i=2;i<sqrt(n);i++) // loop through all the numbers up to the sqrt(n)
    for (j=i*i;j<n;j+=i) // mark off each factor of i by setting it to 0 (False)
      primes[j] = 0;
}

错误讯息:

  

进程返回-1073741571(0xC00000FD)执行时间:2.032 s

2 个答案:

答案 0 :(得分:1)

坚持使用本网站的名称;您正在经历堆栈溢出。 ; - )

尝试

char *v = malloc(n);

void sieve(unsigned long long int n, char *primes)

分别。当然,您还需要

free(v);

除此之外,我还没有检查你的算法的正确性。

答案 1 :(得分:1)

问题是因为你的程序没有足够的内存保留,并且@Pedram Azad提到你有一个堆栈溢出。您可以通过为var(malloc)分配更多内存来绕过它。

此外,您需要开始为代码块(循环和条件语句)使用括号。它有助于可视化问题。缩进非常令人困惑。

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

void sieve(unsigned long long int, char *);


int main()
{
  unsigned long long int i, n = 63000000; // find the primes up to 500000
  char *v = (char*) malloc(n*sizeof(char));
  sieve(n, v);
  for (i=0; i<n; i++) {
    if (v[i] == 1) {
      printf("%lld\n",i); // this just prints out each value if it's Prime
    }
  }
  free(v);
}

void sieve(unsigned long long int n, char *primes)
{
  unsigned long long int i, j;
  for (i=0; i<n; i++) {
    primes[i]=1; // we initialize the sieve list to all 1's (True)
  }
  // Set the first two numbers (0 and 1) to 0 (False)
  primes[0]=0;
  primes[1]=0;
  // loop through all the numbers up to the sqrt(n)
  for (i=2; i<sqrt(n); i++) {
    for (j=i*i; j<n; j+=i) {
      // mark off each factor of i by setting it to 0 (False)
      primes[j] = 0;
    }
  }
}