AcWing 866. 试除法判定质数
由于我是我们队的数论选手,寒假刷题会略偏向于数论方面QWQ,在此记录 2021-01-11 刷题打卡~
AC代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool isPrime(int n) {
if( n < 2)
return false;
for(int i = 2;i<= n / i;i++)
if(n % i == 0)
return false;
return true;
}
int main() {
int n;
cin >> n;
while (n--) {
ll num;
cin >> num;
if(isPrime(num))
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
知识点说明:
试除法判断质数,其实本质是根据质数的定义进行暴力枚举
,但是我们可以通过质数的一个性质,来优化循环的次数,这个性质就是: 如果d是n的约数,那么 n / d也是 n 的约数,即一个数的约数是成对出现的
通过这个性质可以优化试除法,时间复杂度由O(n)变为O(sqrt(n))
注意:
不推荐写法1: for(int i = 2; i<= sqrt(n); i++)
原因:每次循环都要执行sqrt函数,会比较慢
不推荐写法2:for(int i = 2; i * i <= n; i++)
原因:可以会存在溢出的情况
推荐写法!!!
for(int i = 2; i<= n / i; i++)