【问题标题】:Sieve for 8 digit primes筛选 8 位素数
【发布时间】:2015-02-14 09:46:54
【问题描述】:

尽管数组a 的大小不断增加,但我无法找到 8 位素数。它适用于较小的数字:

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

int main()
{
    int n,a[100000],i,m,k;
    scanf("%d",&n);
    for (i=2;i<=n;i++)
        a[i]=1;
    m=(sqrt(n)+1);
    for (i=2;i<=m;i++)
        if (a[i]==1)
            for (k=i*i;k<=n;k+=i)
                a[k]=0;
    for (i=0;i<=n;i++)
        if (a[i]==1)
            printf("%d\t",i);
    return 0;
}

【问题讨论】:

  • 如果您增加a 的大小,使其大到足以拥有 8 位索引,那么您很可能会发生堆栈溢出。

标签: c sieve-of-eratosthenes


【解决方案1】:

通过使用本地声明的数组,我也无法获得大于 6 位的数字。这样的数组使用堆栈内存,与堆内存相比,这是供不应求的。另一个问题是您没有检查为n 输入的值是否会破坏您声明的固定大小数组。我解决了这两个问题,方法是使用malloc() 从堆中分配所需的确切内存量,并检查内存分配是否有效。

我整理的另一件小事是使用\t 来格式化输出。一旦数字变大,就会看起来很乱。我给出了 10 的字段宽度,因为它将包含一个 8 位数字,还因为大多数文本终端的宽度为 80,因此数字不会跨行。

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

int main()
{
    int n,i,m,k;
    int *a;
    scanf("%d",&n);
    if ((a = malloc((n+1)*sizeof(int))) == NULL) {
        printf ("Not enough memory\n");
        exit (1);
    }
    for (i=2;i<=n;i++)
        a[i]=1;
    m=(sqrt(n)+1);
    for (i=2;i<=m;i++)
        if (a[i]==1)
            for (k=i*i;k<=n;k+=i)
                a[k]=0;
    for (i=0;i<=n;i++)
        if (a[i]==1)
            printf("%10d",i);
    printf("\n");
    free (a);
    return 0;
}

【讨论】:

    猜你喜欢
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 2017-11-14
    • 1970-01-01
    • 2023-03-26
    • 2012-12-09
    • 2020-07-22
    相关资源
    最近更新 更多