关于求素数的问题

qq_46403949 2020-03-14 11:51:59
中间有一步是i==j+1 是什么意思?
...全文
155 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
寻开心 2020-03-15
  • 打赏
  • 举报
回复
什么时候 i==j+1 成立呢?
只有当 j为i-1的时候,这个等式才成立
前面虽然有i%j != 0, 但是这个 i==j-1 并不成立
所以, 只有当j =i-1, 也就是for (j) 这个循环运行到最后一次, 并且 i%j == 0 不成立的时候, 才能让 i==j-1 成立
这样说明, 从2到i-1任何一个都不是i的因子, 所以, i必然是素数了


这个代码效率非常的低, 有很多的地方可以优化
但是,最重要到一个问题, 这个算法把2也是素数这个情况給漏了
计算得到的aa数组里面,没有包含2这个素数, 2是最小的素数

这个函数是计算小于等于lim的所有素数,并放到aa数组里面,然后返回素数的个数
因为缺少素数2, 这个函数是错的
stephen_182 2020-03-15
  • 打赏
  • 举报
回复
就是过了i=j+1的时候就不需要判断了,是不是质数就确定了。不过我觉得判断到i的算术平方根向上取整就够了吧。
ipanda_zll 2020-03-14
  • 打赏
  • 举报
回复
第二个for循环如果顺利运行的话,只有从2到i-1,“i%j==0”都不成立时,“i=j+1”才会成立,也就是说此时,i是一个素数,因此返回的MAX值是小于等于lim的值里素数的个数减一,因为2也是素数,但是代码里的for循环会把2排除
qybao 2020-03-14
  • 打赏
  • 举报
回复
就是j循环到了最后一次的时候,就会到达i==j+1,能走到这里,说明i就是质数了,否则中途就break了 其实没必要放在j循环里判断,放在j循环后,的i循环里就好了 即 for (i=1; i<=lim; i++) { for (j=2; j<i; j++) { if (i%j ==0) break; } if (i==j) a[MAX++] = i; //判断放到外面来 }

33,322

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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