大家帮我看看这个C语言程序怎么有一个错误?在哪啊?

来源:百度知道 编辑:UC知道 时间:2024/07/02 01:17:56
#include<stdio.h>
int main()
{
int i,j,sum=0;
int a[1000];
for(i = 2;i<=1000;i++)
a[i] = 1;//全部赋值为1;
for(i = 2;i<=1000;i++)
for(j = i;i*j<=1000;j++)
if(a[i])
a[i*j]=0;//如果为质数的话就它的倍数就不是质数;
for(i = 2;i<1000;i++)
if(a[i])
printf("%d ",i);//打印质数;

return 0;
}

我用VC竟然可以正常运行。。。结果还是对的
确实这个程序有数组下标越界的问题,数组a[1000]是a[0}~a[999],没有a[1000]的。

程序虽然简洁,但多余步骤太多,实际上已经不是素数删选法的思想而是类似穷举了。看这两层循环:
for(i = 2;i<=1000;i++)
for(j = i;i*j<=1000;j++)
底层执行次数为1000×log1000次,很多执行是多余的,例如,i=2时,已经删去了2的倍数;然后i=2k的时候(k为任意自然数),if(a[i])全部为假,这些if判断完全是多余的,可以通过修改i的值,省略这些判断,节省大量运行时间。素数筛选的算法网上肯定很多的,例如这个网址:http://blog.csdn.net/cywater2000/archive/2005/04/05/337580.aspx
给出的算法
其中筛选主循环自变量p,通过语句while(sieve[p] == 0)p++;大大缩减了主循环的次数,底层执行次数,N=1000时小于168×log1000次,(168是1000以内素数个数,来源于素数定理)

第六行,不能取到1000 , 只能取到999
其它的就知道了, 太难看了, 呵呵 加油哦

没有啊,我在Turbo C上运行的.
“;//全部赋值为1;”你的注释没有这么写吧,那就错了。应该是/*全部赋值为1*/

没有错误啊,害我忙半天

数组越界,应该是i<1000

怎么能 int main()呢?