雅痞6 2022-10-09 22:27 采纳率: 81%
浏览 74
已结题

质数口袋,求范围内的质数问题

img

求2到n内的质数问题,这样写输出结果不对很多数循环出现怎么回事

  • 写回答

1条回答 默认 最新

  • 千万469 2022-10-10 05:18
    关注

    因为你输出 j 的语句是在最内层循环,输出j的前提条件不够严谨。先捋一下你的思路吧,外层循环逐一寻找2—n内的质数,内层循环判断j是否为质数(是否能被1和j本身以外的数整除),当判断出j为质数时输出j的值并质数数量d累加,最后输出d的值(PS:思路很好,尤其是用ii<=j判断做除数界限以及用j%i这种取余的方法判断能否被整除的方法,很厉害,非常有程序员的潜质)。以下是我的看法:
    1、既然是找2—n内的质数,那么第5行j的初始化应该为2更严谨;
    2、因为第7行的判断语句是在第二个for循环(内层循环)内的,内层的每次循环只要j不能对i整除就输出一次j,这个逻辑是错误的,这也是运行结果有很多重复数字的原因。i不能被j整除只能说明当前i的值不能作为j的因数,正确的逻辑应该是:用变量a计量j的因数,每次进入内层循环时将a清零,i从2开始累加,每次i能被整除就计j的因数+1,当内层循环结束后判断j的因数是否有除了1和他本身以外的因数,如果是则当前j的值不是质数,否则输出j的值,并令d+1。
    3、第7行的判断条件里的“==”改成“!=”就可以不用后面的else了(“!=”是“不等于”的意思)。或者直接把“==0”去掉也可以,这样当j%i的值为零是则判为“否”,其它情值则判为“是”(“非零即真”)。
    4、感觉输出的数据间隔太远啦。建议每个质数之间隔一个空格,最后要输出质数数量的时候再换行就好了(“\n”是换行的意思,连续两个就是连续换行两次)。
    参考代码:
    #include<studio.h>
    int main(void)
    {
    int a,b=0,n,i,j;
    scanf("%d",&n);
    for(j=2;j<=n;j++)
    {
    for(a=0,i=2;i
    i<=j;i++)
    if(j%i) a++;
    if(a!=0) {peintf(" %d",j);b++;}

    printf("\n%d",b);
    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 10月18日
  • 已采纳回答 10月10日
  • 创建了问题 10月9日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效