知识点
第一种:暴力枚举(未优化从2枚举到n的前一个数)
#include <iostream>
#include <cstdio>
using namespace std;
//询问一个数,输出一行Yes或No。
int n;
bool check=1;
int main()
{
scanf("%d",&n);
if(n==1)printf("No");//特判。
for(int i=2;i<n;i++)//枚举到n前一个数。
{
if(n%i==0)
{
check=0;
break;
}
}
if(check)printf("Yes");
else printf("No");
return 0;
}
时间复杂度:O(n^2) 缺点:每一个数都要枚举,耗时耗空间
第二种方法:暴力枚举(优化只用枚举到根号n前的数)
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int n,i;
bool check=1;
cin>>n;
if(n==1) cout<<”NO”<<endl;
for(i=2;i*i<=n;++i) //这里也可以写成i<=sqrt(n),但是sqrt函数运行较慢
{
if(n%i==0)
{
check=0;
cout<<”NO”<<endl;
break;
}
else cout<<”YES”<<endl;
}
return 0;
}
第三种方法:埃拉托斯尼筛法(埃氏筛)
思想:得到n以内的质数,就要把不大于根号n的质数的倍数剔除。
埃氏筛的优化:将n的倍数标记为合数时,不从2n开始而从n^2开始
【复杂度&#