📜  C测验– 110 |问题2(1)

📅  最后修改于: 2023-12-03 15:14:25.988000             🧑  作者: Mango

C测验-110 | 问题2
介绍

这是一道C语言题目,要求实现一个函数,判断一个整数是否是一个质数。质数是指除了1和它本身以外,不能被其他自然数整除的数。此函数需要返回一个布尔值,如果输入的数字是质数,则返回true,否则返回false。

实现

我们可以使用两种方法来实现这个函数:

方法一

依次判断该数字是否能够被2~(n-1)中的任意一个数字整除,若能够整除则该数字不是质数,返回false。如果不能被整除,说明该数字是质数,返回true。

bool is_prime(int n) {
    if(n < 2) return false;  //小于2不是质数
    for(int i = 2; i <= n-1; ++i) {
        if(n % i == 0) {
            return false;      //如果能够整除,不是质数
        }
    }
    return true;              //否则是质数
}

方法二

对于数字n,假设进行到了k次循环,还没有找到它的因子,那么它的因子一定大于等于k+1。所以可以设置一个计数器变量k,从2开始循环判断n是否能够被整除,如果不能,k+1。一旦找到n的因子,结束循环,判断k是否等于n,如果等于n,则说明n是质数,返回true,否则n不是质数,返回false。

bool is_prime(int n) {
    if(n < 2) return false;  //小于2不是质数
    int k = 2;
    while(k < n) {
        if(n % k == 0) return false;
        ++k;
    }
    if(k == n) return true;   //如果k等于n,说明n是质数
    return false;
}
性能分析

对于第一种方法,它的时间复杂度是O(n),需要遍历2~(n-1)中的所有数字,所以它的性能并不是很好,时间复杂度较高。

而对于第二种方法,它的时间复杂度不超过O(sqrt(n)),因为当k大于sqrt(n)时,n就一定没有因子了,所以只需要遍历2~sqrt(n)中的数字即可。所以它的性能比第一种方法要好,时间复杂度也较低。

总结

判断一个数字是否为质数是一个常见的操作,这道题目考查了对于质数的定义、bool类型及循环结构的掌握程度。虽然有两种方法可以实现,但是第二种方法更加高效,可以有效提高程序的性能。