显示N个质数

时间:2018-11-20 07:00:58

标签: c++ primes

为什么for循环中的while循环只能运行一次?另外,请告诉我寻找素数的逻辑是否正确。该代码仅显示2作为输出。

#include <iostream>
using namespace std;

int main()
{
    int x, z = 0;
    int y = 0;
    int a = 2;

    cout << "Input the number of prime numbers you need: ";
    cin >> x;
    while (x > 0)
    {
        for (int i = 1; i < 11; i++) 
        {
            z = a % i;
            if (z == 0)
            {
              y = y + 1; 
            }
        }

        if (y < 3)
        {
            cout << a << ", " << endl;
            x = x - 1;
        }
        a = a + 1;
    }

    return 0;
}

2 个答案:

答案 0 :(得分:1)

您的基本错误是,y的每次迭代后都没有将变量while重置为零。它只能增长,并且当测试数字3时,它已经足够大,不允许任何数字通过,因此仅通过数字2。

快速修复:之后

    if (y < 3)
    {
        cout << a << ", " << endl;
        x = x - 1;
    }
    a = a + 1; 

插入

    y = 0;

另一个错误是您只检查小于11的数字,这意味着例如121(11 * 11)将为假阳性,如果不是,则程序会认为它是质数。

也就是说,您应该学习如何编写自己更容易调试的代码,尤其是使用调试器。如果您从未使用过调试器,请放心,您将轻松找到相应的教程。在您的情况下,调试器会向您显示y的状态,并且您已经看到它达到了它不应该能够达到的数字。

关于将来代码的两个一般提示:

  1. 使用描述性变量名。 x和y在我看来像座标,但事实却并非如此。给他们适当的名称,例如number_dividers而不是y。

  2. 将代码分成几部分。例如,具有如下功能:

    #include <cmath>
    
    bool is_prime(int number)
    {
        if(i <= 1) return false;
    
        for(int i = 2; i <= std::sqrt(number); i++)
        {
            if(number % i == 0) return false;
        }
        return true;
    }
    

具有这样的功能可以使您的代码更加整洁,允许您重用部分代码,尤其是在您的情况下,允许您单独测试此代码单元,即测试对于给定的输入是否具有正确的输出(基本上是单元测试)。

您的代码现在为:

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

//(insert code from above here)

int main()
{
    int required_primes = 0;
    cout << "State the amount of prime numbers to be found: ";
    cin >> required_primes;

    int found_primes = 0;
    int current_number = 2;
    while(found_primes < required_primes)
    {
        if(is_prime(current_number))
        {
            cout << "Found prime: " << current_number << endl;
            found_primes++;
        }
        current_number++;
    }
}

(描述性的变量名使初次看代码的人更容易理解,您同意吗?)

答案 1 :(得分:-1)

这将解决问题。

 #include <iostream>
 using namespace std;

int main()
{
    int x, z = 0;
    int a = 2;

    cout << "Input the number of prime numbers you need: ";
    cin >> x; 
    while (x > 0) 
    {
        bool isPrime = true;
        for (int i = 2; i < a; i++) 
        {
            z = a % i;
            if (z == 0)
            {
                isPrime = false;
            }
        }

        if (isPrime)
        {
            cout << a << ", " << endl;
            x = x - 1;
        }

        a = a + 1; 
    } 
    return 0;
}