在c ++中查找素数

时间:2018-04-12 02:48:21

标签: c++ primes

我目前正在第一次学习c ++,并且我编写了一个cpp bool函数来查找整数是否为素数。

代码是:

bool isPrime(int n) { 
    for (int i = 2; i < n; i++) {
        if (n % i == 0)
            return false;
        else
            return true;
    }
}

然而,事实证明9也被认为是具有此功能的素数。

我通过删除else语句

找到了解决方案
bool isPrime(int n) { 
    for (int i = 2; i < n; i++) {
        if (n % i == 0)
            return false;
    }
}

但我仍然不明白为什么else语句首先与它有关。任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:1)

由于if声明。

    if (n % i == 0)
        return false;
    else
        return true;

条件为&#34;如果n可被当前数字&#34;整除;条件将为真(在这种情况下n不是素数)或false(可能为素数),因此必须采用其中一个分支,并且在任何一种情况下函数都将退出,可能是过早的。

删除else会阻止提前返回,但是,它也会阻止该函数返回true。您只需将return true添加到函数末尾即可:

bool isPrime(int n) { 
    for (int i = 2; i < n; i++) {
        if (n % i == 0)
            return false;
    }
    return true;    // must be prime
}

答案 1 :(得分:1)

因为它将在第一个循环中返回! 当函数进入else时,它将返回true。 任何奇数都将返回true - 9是第一个大于1的奇数,而不是素数。

试试这个:

bool isPrime(int n) { 
    for (int i = 2; i < n; i++) {
        if (n % i == 0)
            return false;
        else
            continue;
    }
    return true;
}

答案 2 :(得分:1)

数字是素数的唯一方法是循环完成时,因此return true;语句应该在循环之外。您只需检查最多n的平方根的数字。

此外,您需要处理n小于2的情况。

#include <cmath>

bool isPrime(int n)
{
    if (n < 2)
    {
        return false;
    }
    for (int i = 2; i <= sqrt(n); i++)
    {
        if (n % i == 0)
        {
            return false;
        }
    }
    return true;
}

答案 3 :(得分:0)

9很奇怪。这意味着它不能被2整除。实际上它是1之后的第一个奇数,而不是素数。如果n不能被2整除,则代码显式返回true。

for (int i = 2; i < n; i++) {
    if (n % i == 0)
        return false;
    else
        return true;
}

for循环第一次运行时,i为2. n % i == 0为真或为假。如果为true,则函数立即返回false。如果为false,则函数立即返回true。

您需要在循环外移动return true语句。只有在通过完成for循环检查所有可能的除数后才知道数字n是否为素数。