题目地址:
https://www.acwing.com/problem/content/868/
给定 n n n个正整数 a i a_i ai,判断其是否是质数。
输入格式:
第一行包含整数
n
n
n。接下来
n
n
n行,每行包含一个正整数
a
i
a_i
ai。
输出格式:
共
n
n
n行,其中第
i
i
i行输出第
i
i
i个正整数
a
i
a_i
ai是否为质数,是则输出“Yes”,否则输出“No”。
数据范围:
1
≤
n
≤
100
1\le n\le 100
1≤n≤100
1
≤
a
i
≤
2
31
−
1
1\le a_i\le 2^{31}-1
1≤ai≤231−1
容易证明,如果 x x x不是质数,那么 x x x一定有位于 [ 2 , x ] [2,\sqrt x] [2,x]的质因子。所以可以用试除法,对于每个 x x x,如果 x < 2 x<2 x<2则不是质数,否则从 2 2 2开始遍历到 x \sqrt x x,只要发现某个 x x x的因子,则返回false。但是在写代码的时候,循环最好应当写成:
for (int i = 2; i <= n / i; i++)
这样可以避免使用sqrt
函数,并且可以防止溢出。代码如下:
#include <iostream>
using namespace std;
bool is_prime(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--) {
int x;
cin >> x;
if (is_prime(x)) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
每次询问时间复杂度 O ( x ) O(\sqrt x) O(x),空间 O ( 1 ) O(1) O(1)。