素数的判断以及如何写好一段代码
素数的判断
素数的判断关键在于将题目转换为数学问题并用数学语言表示它
int k=(int)sqrt(a);
for(int i=2;i<k;i++)
{
if(a%k==0)
{
...;
break;
}
else ...;
}
这里还要注意特殊点,当m=1时不是素数,这个要单独判断
#include<iostream>
#include<cmath>
using namespace std;
bool isprime(int a)
{
int k;
k=(int)sqrt(a);
if(a<2)
{
return 0;
}
for(int j=2;j<k;j++)
{
if(a%j==0)
{
return 0;
}
}
return 1;
}
int main()
{
int n,m;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>m;
if(isprime(m))
{
cout<<"Yes"<<endl;
}
else cout<<"No"<<endl;
}
return 0;
}
这是其中的一种做法,也是最普遍的做法,当然也可以不调用其他函数,直接在主函数
里写,不过此时最好立个flag,比较方便,但要注意,用flag就不用再单独套路m的情况了,直接用flag来判断
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,m,t;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>m;
t=(int)sqrt(m);//开方会比较节省时间和空间
int flag=m>1;//本来flag可以随便设个数的,但由于在这里要满足能判断m=1的情况,因此直接立flag=m>1
for(int j=2;j<=t;j++)
{
if(m%j==0)
{
flag=0;
break;//不用所有的数都判断完,只要有一个满足就够了
}
}
if(flag==0)
{
cout<<"No"<<endl;
}
else cout<<"Yes"<<endl;
}
return 0;
}
反思:
1.这道题犯了一个很典型的错误,采用那两种做法都犯的错,就是直接单独讨论m=1的情况,但在循环里面又再判断了一次,也就是当输入1,则结果会输出两个。
2.不要循环,判断输出三者一起,有可能会搞乱,从而输出错误结果的同时还不知道怎么寻找错误。