筛选8位数的素数

时间:2015-02-14 09:46:54

标签: c sieve-of-eratosthenes

尽管数组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;
}

1 个答案:

答案 0 :(得分:4)

通过使用本地声明的数组,我无法获得大于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;
}
相关问题