c - 超过 500000 用 Eratosthenes 的方法

标签 c primes

我有一个我无法解决的问题

我想知道给定极限 x 以下的所有素数。允许我输入 x 并使用 Erastosthenes 的方法计算素数。在屏幕上显示结果并将其保存到文本文件。

计算 x 下面的质数,打印它们并将它们保存到文本文件中,我遇到的唯一问题是 x 不能超过 500000 你们能帮帮我吗?

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

void sieve(long x, int primes[]);

main()
{
    long i;
    long x=500000;
    int v[x];

    printf("give a x\n");
    scanf("%d",&x);

    FILE *fp;

    fp = fopen("primes.txt", "w");
    sieve(x, v);
    for (i=0;i<x;i++)
    {
        if (v[i] == 1)
        {
            printf("\n%d",i);
            fprintf(fp, "%d\n",i);
        }
    }
    fclose(fp);
}

void sieve(long x, int primes[])
{
    int i;
    int j;
    for (i=0;i<x;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(x);i++) // loop through all the numbers up to the sqrt(n)
    {
        for (j=i*i;j<x;j+=i) // mark off each factor of i by setting it to 0 (False)
        {
            primes[j] = 0;
        }
    }

}

最佳答案

通过声明 char v [500000] 而不是 int v [100000],您将能够处理四倍多的值。

通过声明 unsigned char v [500000] 并为每个素数仅使用一个位,您可以处理八倍以上的值。这使得代码有点复杂。

通过只筛选奇数,您可以处理两倍的值。由于 2 是唯一的偶素数,因此将它们留在筛子中毫无意义。

由于函数中局部变量的内存通常非常有限,您可以使用静态数组处理更多的值。

关于c - 超过 500000 用 Eratosthenes 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29709087/

相关文章:

c - 在不复制的情况下将堆数据保存在映射文件中?

c# - 如何确定一个非常大的数是否是质数?

c - 如何在C中增长字符数组的数组

c++ - 是否可以使用 C/C++ 构建企业应用程序?

C 函数第二次运行时抛出异常

c++ - 素数600万以上

math - 有没有办法找到第n个素数的近似值?

java - 为什么这两种素数采样方法运行的时间一样长?

c - 欧拉在 C 中的 totient 函数

HackerRank 网站中的 Clang 问题 "Small Triangles, Large Triangles"