题目描述
给定 n 个正整数 ai,判定每个数是否是质数。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个正整数 ai。
输出格式
共 n 行,其中第 i 行输出第 i 个正整数 ai 是否为质数,是则输出 Yes,否则输出 No。
数据范围
自己看去!!!
样例
输入
2
2
6
输出
Yes
No
试除法
详细思路看视频题解,以及本蓝代码
参考文献
给定一个合数n(这里,n是待分解的整数),试除法看成是用小于等于n的每个素数去试除待分解的整数。如果找到一个数能够整除除尽,这个数就是待分解整数的因子。试除法一定能够找到n的因子。因为它检查n的所有可能的因子,所以如果这个算法“失败”,也就证明了n是个素数。
试除法可以从几条途径来完善。例如,n的末位数不是0或者5,那么算法中就可以跳过末位数是5的因子。如果末位数是2,检查偶数因子就可以了。
某种意义上说,试除法是个效率非常低的算法,如果从2开始,一直算到需要pi(x)次试除,这里pi(x)是小于x的素数的个数。这是不包括素性测试的。如果稍做变通——还是不包括素性测试——用小于的奇数去简单的试除,则需要次。
这意味着,如果n有大小接近的素因子(例如公钥密码学中用到的),试除法是不太可能实行的。
但是,当n有至少一个小因子,试除法可以很快找到这个小因子。值得注意的是,对于随机的n,2是其因子的概率是50%,3是33%,等等。88%的正整数有小于100的因子,91%的有小于1000。
C++ 代码
#include<bits/stdc++.h>//万能头走起,y总那么多个头(文件!!!)总感觉有点怪怪的
using namespace std;
bool prime(int a)
{
if(a<=1)
{
return 0;
}//特判1,0
for(int i=2;i<=sqrt(a);i++)//自己理解
{
if(!(a%i))//如果a模i等于0
{
return 0;
}
}
return 1;
}
void out(bool j)//输出函数
{
if(j)
{
cout<<"Yes\n";
}
else
{
cout<<"No\n";
}
}
int main()
{
int n;
cin>>n;
int j;//判断的数
for(int i=1;i<=n;i++)
{
cin>>j;
out(prime(j));//组合拳
}
return 0;
}
本次小目标:点赞突破
#3
# 干!
呜呜呜~~~
这是本蓝第一次发题解
勿喷~