题目展示区
题目描述:
给定一个整数序列 A, 长度为 N, 判定序列 A 中每个数是否为质数
输入格式:
第一行包含一个整数 N, 接下来 N 行, 每行包含一个整数
输出格式:
共 n 行, 其中第 i 行输出第 i 个正整数 是否为质数,是则输出 "Yes", 否则输出"No"。
数据范围:
1 ≤ N ≤ 100, 1 ≤ ≤ - 1
输入样例:
2
2
6
输出样例:
Yes
No
相关概念介绍区
整除:
整数 a 除以自然数 b 除得的 商 正好是 整数 而 余数 是 零, 我们就能说 a 能被 b 整除,
或者说 b 能整除 a。
因子:
因子就是所有可以整除这个数的数,不包括这个数自身.
质数:
在大于1的自然数中,除了1和该数自身外, 无法被其他自然数整除 的数, 最小的质数是 2
题目分析区
解题宝剑:
假设一个质数为 n
质数的定义,换句人话来讲,就是 质数只能被 1 和 其自身 两个数整除,也就是说,
我们无法从 2 到 n - 1 中找到 一个可以 整除 n 的数
解题大法:
判断 n 是否是质数
我们可以让 n 除以从 2 到 n - 1 中的每个数,如果说出现了余数是 0 的情况,那么这个
数就不是质数,否则就是质数, 但是这里需要特判一下 2 这个数字
大法提纲:
如果给一个数 n 分解成两个数的乘积,那么一定有个数大于 , 一个数小于 ,
所以我们只枚举 2 到 之间的整数就可以了,此时既不需要特判 2 ,同时也在运行效率上
有了较大的提升
代码 + 注释区
核心代码区:
bool is_prime(int n){
if (n < 2) return false;
// 如果是小于 2 的数,直接返回false
// i * i 有可能会溢出
// sqrt() 效率比较慢
for (int i = 2; i <= n / i; i ++)
if (n % i == 0) return false;
// 否则就是质数
return true;
}
整体代码区:
#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;
for (int i = 1; i <= n; i ++){
int a;
cin >> a;
if (is_prime(a)) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}