赞
踩
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)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。