C++求素数问题
黄舟
黄舟 2017-04-17 14:19:33
0
2
1015

/第七行中如果写成:for(m=1;m<=100;m=m+2)然后底下删去十一和十二行, 就可以输出除2外所有素数/
//那么如果要输出加上2的素数,我的这个程序错在哪(输出结果是2、3交替不停输出,都看不清

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int m,n,k;
    for(m=1;m<=100;m=m+1)//7
    {   bool prime=true;
        k=int(sqrt(float(m)));
        for(n=2;n<=k;++n)
        {if (m=2)//11
        break;//12
        else if(m%n==0)
        {prime=false;
        break;}
        }
        if (prime==true)
            cout<<m<<endl;

    }
    return 0;
}
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(2)
Ty80

错误在哪儿?

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int m,n,k;

    for (m=1; m<=100; m++) {

        bool prime = true;

        k = int(sqrt(float(m)));

        for (n=2; n<=k; n++) {
            if (m=2) { // 問題在此, 應改為 if (m==2)
                break;  
            }
            else if (m%n==0) {
                prime = false;
                break;
            }
        }

        if (prime==true) {
            cout << m << endl;
        }
    }

    return 0;
}

该行的错误会造成第一个印出的值为 1, 之后 2, 3 交错.

为什么呢?首先, m==1 的时候不会进去内层 for loop 但此时的 primetrue, 所以你会印出 1.

再来当 m==2m==3 的时候是正常的, 两者皆不会进入内层 for loop, 然后都会被印出.

接着当m==4 的时候, 进入了内层for loop, 但在if (m=2) 这一步会让m 被设成2, 且离开回圈, 此时的prime 仍然为true 导致2 重复被印出.

接着 m 再下一次回圈会成为 3 (2+1), 此时 3 重复被印出.

接着你我都懂了, m==4 会让一切陷入不可自拔的循环.

解决错误

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int m,n,k;

    for (m=2; m<=100; m++) {

        bool prime = true;

        k = int(sqrt(float(m)));

        for (n=2; n<=k; n++) {
            if (m==2) {
                break;  
            }
            else if (m%n==0) {
                prime = false;
                break;
            }
        }

        if (prime==true) {
            cout << m << endl;
        }
    }

    return 0;
}

很简单, 首先将 m=2 改正为 m==2, 其次为了避免 1 被印出, 我建议外层的 for 直接从 2 开始走就好.

其他建议

  1. 代码的排版很重要, 会影响可读性, 建议有自己一套逻辑, 尽量排得好看

    • 建议层次要分明(内层的 block 就要记得缩排)

    • 代码别太壅挤

    • 我个人建议即便是单行的 if/else/for 都加上 {}, 统一, 好读且不容易出问题

  2. 可以尝试抽出写 function

  3. 下次遇到错误可以自己模拟电脑跑个两三次 loop 很容易抓到问题


我回答过的问题: Python-QA

伊谢尔伦

for(int i=2;i if(n%i==0){

雷雷

}
}
返回 true;

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!