判断质数-- 试除法判定质数(终于有人给我说明白了)

发布时间:2024年01月11日


原题链接

判断质数

给定 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;
}
文章来源:https://blog.csdn.net/weixin_52243202/article/details/135521472
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。