使用PrimeCheck函数的前n个质数

时间:2018-10-22 16:30:37

标签: c++

我的任务是使用CheckPrime函数打印前n个质数。我设法用一个数字做到了这一点,但是我应该怎么做才能使它起作用并向我显示第一个'n'质数?!

代码:

#include <iostream>
using namespace std;

int eprim(int num)
{
  int bec=1,i;
  for(i=2;i<=num/2;i++)
  {
    if(num%1==0)
    {
        bec=0;
        break;
    }
  }
  return bec;
}

int main()
{
  int num,bec,i,n,
  cout<<"intr numarul"<<endl;
  cin>>num;
  bec = eprim(num);
  if (bec==1)
  {
    cout<<"este prim";
  }
  else
  {
    cout<<"Nu este prim";
  }
  return 0;
}

3 个答案:

答案 0 :(得分:0)

进行循环,然后计数直到获得所需的号码。

int i = 0;
int number = 2;
while(i < n)
{
  if(eprim(number) == ??)
  {
    ++i; // is a prime number
  }
  ++number;
}

我不知道您的函数应该返回什么,因为(num%1==0)始终为真。

答案 1 :(得分:0)

您的素数检查功能是错误的,对于2到n / 2之间的每个数字,您都要测试它是否被1除,这对于每个数字都是微不足道的。 eprim中的for循环将始终返回0。因此您的函数将说根本没有质数。

要解决此问题,请在素数检查功能内检查每个i的除法,而不是1,如下所示:

int eprim(int num)
{
    int bec = 1, i;
    for (i = 2; i <= num / 2; i++)
    {
        if (num % i == 0)
        {
            bec = 0;
            break;
        }
    }

    return bec;
}

现在,要检查每个数字,直到从输入中读取一个恒定的值,您需要在主函数内部添加另一个for循环:

int main()
{
    int num, bec, i, n;

    cout << "intr numarul" << endl;
    cin >> num;

    for (i = 2; i <= num; i++)
    {
        bec = eprim(i);
        if (bec == 1)
        {
            cout << "este prim" << endl;
        }
        else
        {
            cout << "nu este prim" << endl;
        }
    }

    return 0;
}

还请注意,通过仅检查(int)sqrt(num)之前的数字而不是num / 2,可以以更有效的方式进行素数检查。

答案 2 :(得分:0)

您的代码应如下所示:

#include <iostream>

using namespace std;

int main()
{
    int prime = 1;
    int counter = 1;
    int numPrimes;
    bool isPrime;

    cout << "How many primes: ";
    cin >> numPrimes;

    while(counter <= numPrimes){
        prime += 1;  
        isPrime = true;
        for(int i = 2; i <= prime/2; i++){
            if(prime % i == 0){
                isPrime = false;
                break;
            }
        }
        if(isPrime){
            cout << prime << endl;
            counter += 1;
        }
    }
}