/第七行中如果写成: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;
}
PHP中文网2017-04-17 14:21:33
#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 但此时的 prime
是 true
, 所以你会印出 1.
再来当 m==2
和 m==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 开始走就好.
代码的排版很重要, 会影响可读性, 建议有自己一套逻辑, 尽量排得好看
建议层次要分明(内层的 block 就要记得缩排)
代码别太壅挤
我个人建议即便是单行的 if/else/for
都加上 {}
, 统一, 好读且不容易出问题
可以尝试抽出写 function
下次遇到错误可以自己模拟电脑跑个两三次 loop 很容易抓到问题
我回答过的问题: Python-QA