给定 n个正整数 ai,判定每个数是否是质数。
输入格式
第一行包含整数 n
。
接下来 n
行,每行包含一个正整数 ai
。
输出格式
共 n
行,其中第 i
行输出第 i
个正整数 ai
是否为质数,是则输出 Yes,否则输出 No。
数据范围
1≤n≤100,
1≤ai≤2^31?1
输入样例:
2
2
6
输出样例:
Yes
No
题主其实之前一直不太明白此类题目的思路
后面又看了y总的解释 终于知道自己的缺陷在那一部分
下面讲解
质数的概念:
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
如何判断是否为质数?
题主三月份面试的时候 面过这道题 当时还是用的
为什么 i从 2 开始 因为2是最小的质数 小于二的不是质数
for(int i =2 ;i<num;i++)
{
if(num% i == 0)
return false;
}
return true;
显然这样时间复杂度上面肯定不满足
那么需要用到下面这种方式 去大大缩减其时间复杂度
for(int i =2 ;i<num /i;i++)
{
if(num% i == 0)
return false;
}
return true;
为什么i<num /i 而不是i*i <num?
因为可能出现整数溢出的情况
注意上面的数字范围1≤ai≤2^31?1
为什么用这种方式?
因为如果num 可以整除a 那么如果 num /a =b;
假设a为偏小的数字 那么a的平方就一定小于 num这个数字
所以当 a < num/a的时候 表示这个范围内可能满足它不是质数的条件
再继续往后遍历没有必要 ?
因为再遍历可能就会出现 b
用 num%b的情况 已经用num%a 来排除了 如果a满足那么b肯定也满足 所以不用再继续遍历
以上为核心思路
这是思路 当时看此题解并不理解途中的题解:
后面发现是自己的整数概念弄反了
#include<iostream>
using namespace std;
bool isprime(int num)
{
if(num <2) return false;
for(int i=2; i <= num/i ;i++)
{
if(num%i == 0) return false;
}
return true;
}
int main()
{
int n =0;
cin>>n;
while(n--)
{
int num = 0;
cin>>num;
if(isprime(num))
{
printf("Yes \n");
}
else
{
printf("No \n");
}
}
return 0;
}