新手:关于C语言“筛选法求素数”的一点疑问

a673921712 2012-12-13 09:53:00
一.问题:用筛选法求100以内的素数
二.程序如下:
#include<stdio.h>
int main(void)
{
int a[101],i,j,n; //定义数组a:包含101个元素
for(i=1;i<101;i++) //a[0]不用,只用a[1]-a[100];
a[i]=i; //让a[1]-a[100]为1-100;
a[1]=0; //1为非素数,挖掉
for(i=2;i<100;i++)
for(j=i+1;j<101;j++) //用i依次除它后面的数
{
if(a[i]!=0&&a[j]!=0)//-------->为什么一定要把这句加上输出才正确?
if(a[j]%a[i]==0)
a[j]=0; //让非素数的值为0
} //以上过程是把非素数挖掉
n=0; //换行用
for(i=2;i<101;i++)
{
if(a[i]!=0)
{
printf("%5d",a[i]);
n++;
}
if(n%10==0)
printf("\n");
} //输出素数
printf("\n");
return 0;
}
三.疑问
为什么必须要加上这句“if(a[i]!=0&&a[j]!=0)”,程序才能执行?
前面的代码明显可以推出a[i]!=0,a[j]!=0,是计算机推不出,还是其它什么原因。
希望各位解答下我的疑惑,谢谢。
...全文
307 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
a673921712 2012-12-14
  • 打赏
  • 举报
回复
引用 1 楼 zhaoming262350 的回复:
#include<stdio.h> int main(void) { int a[101],i,j,n; //定义数组a:包含101个元素 for(i=1;i<101;i++) //a[0]不用,只用a[1]-a[100];这儿不正确所有数组都是从a[0] //开始的但是a[0]……
麻烦你再回来帮我看看。
a673921712 2012-12-14
  • 打赏
  • 举报
回复
希望路过的朋友们看看,我一直想不通。
a673921712 2012-12-14
  • 打赏
  • 举报
回复
一、 for(i=1;i<101;i++) //a[0]不用,只用a[1]-a[100];这儿不正确所有数组都是从a[0]开始的 a[i]=i; //让a[1]-a[100]为1-100;a[0]-a[99]赋值为1-101 RE:数组是从a[0]开始,但我不对a[0]赋值,只对a[1]-a[100]赋值,使之相应为1-100,这个应该没有问题吧。 二、 for(i=2;i<100;i++) for(j=i+1;j<101;j++) //用i依次除它后面的数 { if(a[i]!=0&&a[j]!=0)//-------->为什么一定要把这句加上输出才正确? 外循环是从a[2]开始,内循环是从a[3]开始,而a[2]=2,a[3]=3,二者明显不等于零,为什么一定要那么申明?这个就是我最大的疑问。
a673921712 2012-12-14
  • 打赏
  • 举报
回复
弄懂了,感谢大家。
a673921712 2012-12-14
  • 打赏
  • 举报
回复
引用 5 楼 WizardOz 的回复:
前面的代码不能推出不等于零,除非你把限制条件写到循环条件中去。 C/C++ code?12345678for(i=2;i<100;i++) { if (a[i] == 0) continue; for(j=i+1;j<101;j++) { //用i依次除它后面的数 if (a[j] == 0) continue; ... ……
首先,对于你的回答表示感谢。但你可以告诉我为什么推不出吗?第一个外循环是从i=2开始的,a[2]=2,明显不等于零,它后面的数也不会等于零。难道计算机是从数组a[]中的a[0]开始检索,而不是以循环中的初值a[2]为起点?
天残的缺 2012-12-14
  • 打赏
  • 举报
回复
挖去的数为0,避免重复!
WizardOz 2012-12-14
  • 打赏
  • 举报
回复
前面的代码不能推出不等于零,除非你把限制条件写到循环条件中去。

for(i=2;i<100;i++) {
    if (a[i] == 0) continue;
    for(j=i+1;j<101;j++) {  //用i依次除它后面的数
        if (a[j] == 0) continue;
  
        ...
    }
}
zhaoming262350 2012-12-13
  • 打赏
  • 举报
回复
#include<stdio.h> int main(void) { int a[101],i,j,n; //定义数组a:包含101个元素 for(i=1;i<101;i++) //a[0]不用,只用a[1]-a[100];这儿不正确所有数组都是从a[0] //开始的但是a[0]=1,a[1]=2,循环体内的是赋值,不是数组的索引 a[i]=i; //让a[1]-a[100]为1-100;a[0]-a[99]赋值为1-101 a[1]=0; //1为非素数,挖掉 for(i=2;i<100;i++) for(j=i+1;j<101;j++) //用i依次除它后面的数 { if(a[i]!=0&&a[j]!=0)//-------->为什么一定要把这句加上输出才正确?a[i]!=0是因为除数不 //能为0, if(a[j]%a[i]==0) a[j]=0; //让非素数的值为0 } //以上过程是把非素数挖掉 n=0; //换行用,定义的处置 for(i=2;i<101;i++) { if(a[i]!=0) { printf("%5d",a[i]); n++; //统计输出数字的个数 } if(n%10==0) //每一行输出10个数,用于换行 printf("\n"); } //输出素数 printf("\n"); return 0; } 这个是程序中你的问题

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧