下C语言中if(a[i]!=0&&a[j]!=0),为何不能省略。a[i]和a[j]应该不可能取值为0的。

#include<stdio.h>
#include<math.h>
int main()
{
int i,j,n,a[101];
for(i=1;i<=100;i++)
a[i]=i;
a[1]=0;
for(i=2;i<sqrt(100);i++)
for(j=i+1;j<=100;j++)
{
if(a[i]!=0&&a[j]!=0)
if(a[j]%a[i]==0)
a[j]=0;
}
printf("\n");
for(i=2;i<=100;i++)
{if(a[i]!=0)
{printf("%5d",a[i]);
}
}
printf("\n");
return 0;
}

在这个地方,让存于数组内的3~100分别除以从2到sqrt(i)的值,以此来判断是否为素数。

前面是从a[2]开始赋值的。需要判断a[i]和a[j]不能为0;后面的则是在一个i的循环内用j——i后面的整数,来除以i,如果除尽了则让a[j]为0;为0了i的话,也需要在第一步的”判断a[i]和a[j]不能为0”的前提下,就可以把除尽的,也就是非素数给排除掉。后面直接把a[j]不为0的输出就是素数了。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-11
这个大概是求出1到100之间的素数吧。
第一轮循环(i=2)的确是都不会是零,但是第二轮(i=3)循环的时候就会有零了。
此时2的倍数都已被复制零在赋值也没有意义。
但是问题出在(i=4)的时候a[4]=0,如果直接判断a[j]%a[i]==0就会出错,除数显然不能等于零。本回答被提问者采纳
第2个回答  2011-12-11
不能够省略
if(a[i]!=0&&a[j]!=0)
if(a[j]%a[i]==0)
a[j]=0; //此处你把a[j]置为0 了,所以可能在执行除法以前需要判断是否为0.
第3个回答  2011-12-11
是有可能值为0的
因为有这一行 a[j]=0;

所以在for回圈内执行时 可能会产生0的情况