算法备忘录~判断是否为素数

该博客介绍了两种判断素数的方法。思路1是通过遍历2到目标数n-1来检查因数,时间复杂度为O(n)。思路2优化了这个过程,只遍历到√n,利用合数一定有小于平方根的质因子,时间复杂度降低到O(√n)。这两种方法对于素数判断的效率有显著区别。
摘要由CSDN通过智能技术生成

题目:

        编写一个函数,判断一个数是否为素数,并返回结果

        素数定义:(质数prime  number)定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,素数有无穷多个。

思路1:

        用目标数依次对从2 ~ n-1遍历的每个数作取余操作(注意不包括1和其本身),如果取余结果为零,说明存在其他的因数,返回false

思路1代码实现:

时间复杂度 O(n)

int isPrime(int k)
{
    int j;
    for ( j=2; j<k; j++ )    
    {
        if(k%j==0)    // 如果不为素数返回0 
        {
             return 0;
        }
        }
    return 1;    // 反之则返回1 
}

思路2:

        在思路1基础上优化,缩小遍历范围,用目标数依次对从2 ~ √n(平方根)遍历的每个数作取余操作(注意不包括1和其本身),如果取余结果为零,说明存在其他的因数,返回false

         为什么是平方根√n呢?因为不相同的两个因数如果相乘等于n,那么一定是分布在√n的左右两侧的,也就是说一定有一个大于√n,一个小于√n,那么只要验证的时候只要验证到等于平方根√n的时候就可以了,即一个合数一定含有小于它平方根的质因子。

思路2代码实现:

时间复杂度 O(√n)

int isPrime(int n)
{
    int i;
    for ( i=2; i<=sqrt(n); i++ )    
    {
        if(n%i==0)    // 如果不为素数返回0 
      {
           return 0;
        }
    }
    return 1;    // 反之则返回1
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值