数字 3、5 和 7 未显示为素数

Numbers 3, 5, and 7 not being displayed as prime

本文关键字:显示 数字      更新时间:2023-10-16

我需要创建一个在两个输入数字之间生成素数的函数。我通过测试范围内每个数字的素数来做到这一点。问题是数字 3、5 或 7 永远不会显示。我不确定出了什么问题。

这就是我测试数字素数的方式:

bool isPrime(int number){
    using namespace std;
    if((number%2==0) || (number%3==0) || (number%4==0) || (number%5==0) ||
       (number%6==0) || (number%7==0) || (number%8==0) || (number%9==0))
    {
        return false;
    }
    else if ((number/1==number) && (number/number==1))
    {
        return true;
    }
}

3 是 3 的倍数。 5 是 5 的倍数。 7 是 7 的倍数。您编写的代码为 3、5 或 7 的任意倍数返回 false,因此它不可能为这些数字返回 true。您只需要检查小于您正在检查的数字的素数的可除性。

您还可以检查许多不必要的合数的可整除性;例如,一个数字不能是 4 的倍数而不是 2 的倍数,它不能是 6 的倍数而不是 2 3 的倍数。这些检查除了浪费时间外什么也做不了。

最后,从长远来看,你的代码在100%的时间内都是错误的,因为它检查的最高素数是7。它会说 169 (13 * 13( 是素数,因为它不能被你检查的任何数字整除,但它显然是复合的。对于试验除法,您需要检查所有小于或等于 floor(sqrt(n((的素数(,要么通过对复合进行大量不必要的检查,要么通过随时建立素数列表(类似于埃拉托色尼筛,通常由 CS 类型调用,但我认为它不是严格等价的(。

一个非常简单(但不是那么有效(的方法:

bool is_prime(int i)
{
    int root = (int)std::sqrt(i);
    bool result = true;
    for (int j = 2; j <= root; ++j)
    {
        if (i % j == 0)
        {
            result = false;
            break;
        }
    }
    return result;
}

你可能想看看这篇文章。

这是一种寻找质数的系统方法。使用此算法不断查找素数,直到达到输入的上限值。

看看这行代码:

if((number%2==0) || (number%3==0) || 
   (number%4==0) || (number%5==0) ||
   (number%6==0) || (number%7==0) ||
   (number%8==0) || (number%9==0))
   return false;

想想如果你插入 2、3、5 或 7 会发生什么。 在每种情况下,您都会发现数字 mod 2、mod 3、mod 5 或 mod 7 确实为零,因此您的代码将返回 false。 这可能解释了为什么你得到这些数字不算作素数。

但是现在看看下一句话:

else if ((number/1==number) && (number/number==1)){
    return true;
}

在什么情况下这是错误的? 每个数除以一都是它自己,每个数除以自身都是一,所以每个数字都通过了这个测试。 因此,您的代码将在任何数字上返回 true,只要它不能被 2、3、4、5、6、7、8 或 9 整除。 尝试插入 11 x 13 = 143。 这个数字不是素数,但你的函数会说它是。

其他人已经发布了您可以采取的其他途径来解决问题,但从根本上说,我认为问题是,如果没有 1 以外的数字并且本身是除数,则数是素数。 你的函数需要以某种方式考虑这一点,可能是通过检查它下面所有不是一个或本身的数字。 正如一些答案所提出的那样,可以进一步优化这一点,但您应该意识到,在基本层面上,这是需要做的。

希望这有帮助!

或者您可以使用此算法:

#include<iostream>
#include<string>
#include<cmath>
using namespace std;
int main()
{
    int num;
    int count = 0;
    cout << "Enter your range: ";
    cin >> num;
    for(int i = 1; i <= num; i++)
    {
        count = 0;
        for(int j = 2; j <= sqrt(i); j++)
        {
            if(i % j == 0)
            {
                count++;
                break;
            }
        }
        if(count == 0 && i != 1)
            cout << i << "   ";
    }
    cout << endl;   
}