质数:在大于1的整数中,如果只包含1和本身这两个约数,就被称为质数,或者叫素数。(小于等于1的整数既不是质数也不是合数)
题目:
代码:
朴素做法:O(n)超时
#include<iostream>
#include<algorithm>
using namespace std;
bool is_prime(int n){
if(n<2) return false;
for(int i=2;i<n;i++){
if(n%i==0)
return false;
}
return true;
}
int main(){
int n;
cin>>n;
while(n--){
int a;
cin>>a;
if(is_prime(a)) puts("Yes");
else puts("No");
}
return 0;
}
优化:O(sqrt(n))
发现质数的约数都是成对出现,例如:n/a=b,那么n/b=a,a和b是n的一对约数,所以只枚举每一对中较小的那一个即可,只枚举d<=(n/d)的数,即d^2<=n,即d<=sqrt(n);
#include<iostream>
#include<algorithm>
using namespace std;
bool is_prime(int n){
if(n<2) return false;
for(int i=2;i<=n/i;i++){ //i<=sqrt(n)每次都会调用sqrt()函数需要时间;i*i<=n存在溢出风险
if(n%i==0)
return false;
}
return true;
}
int main(){
int n;
cin>>n;
while(n--){
int a;
cin>>a;
if(is_prime(a)) puts("Yes");
else puts("No");
}
return 0;
}