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