雅痞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 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法