C++质数程序

C++ Prime Numbers program

本文关键字:程序 C++      更新时间:2023-10-16

我正在开发一个C++程序,该程序可以确定并打印用户输入的 3 和整数"x"之间的质数。 我假设我需要一个双嵌套循环,一个从 3 迭代到 x,另一个检查数字是否为素数。 我认为它需要做一些事情,比如从 2 到 x-1? 我只是真的不确定如何在语法上做到这一点。感谢您的任何帮助!:)

编辑: 这是我所拥有的:

#include <iostream>
#include <cmath>
using std::cout;
using std::endl;
using std::cin;
int main(){
   int x;
   int i;
   int j;
   cout << "Please enter an integer 'x' greater than 3: " << endl;
   cin >> x;
   if (x <= 3){
        cout << "Please enter new value 'x' greater than 3: " << endl;
        cin >> x;
   }
        for(int i=3; i<=x; i++){
                for(j=2; j<i; j++){
                   if(i%j == 0)
                        break;
                   else if(i == j+1);
                        cout << i << endl;
                   }
        }
        return 0;
}

当我输入 10 作为"x"时,我得到输出:3555777779

谁能告诉我如何解决这个问题?

只要你的X足够小,你可以使用埃拉托色尼筛来更有效地做到这一点。这是"素数最多 X"情况的理想选择,因为它保留了以前丢弃的素数的记忆。它通过为每个候选编号保留一组标志来实现这一点,所有标志最初都设置为 true(当然,1 除外)。

然后,你取第一个真值 (2),将其输出为素数,然后将该值的所有倍数的标志设置为 false。

然后继续:

  • 3;
  • 5(因为 4 是 2 的倍数);
  • 7(因为 6 是 2 和 3 的倍数);
  • 11(因为 8 和 10 是 2 的倍数,9 是 3 的倍数);
  • 13(因为 12 是 2 的倍数);
  • 17(因为 14 和 16 是 2 的倍数,15 是 3 和 5 的倍数);
  • 等等。

伪代码类似于:

def showPrimesUpTo (num):
    // create array of all true values
    array isPrime[2..num] = true
    // start with 2 and go until finished
    currNum = 2
    while currNum <= num:
        // if prime, output it
        if isPrime[currNum]:
            output currNum
            // also flag all multiples as nonprime
            clearNum = currNum * 2
            while clearNum <= num:
                isprime[clearNum] = false
                clearNum = clearNum + currNum
        // advance to next candidate
        currNum = currNum + 1

否则,您可以按照自己的建议进行试用划分。基本思想是检查从 2 到目标数字的平方根的每个数字,看看它是否是倍数。在伪代码中,这将是这样的:

def isPrime (num):
    // val is the value to check for factor
    val = 2
    // only need to check so far
    while val * val <= num:
        // check if an exact multiple
        if int (num / val) * val == num:
            return false
        // no, carry on
        val = val + 1
    // if no factors found, it is a prime
    return true

您只需要检查平方根的原因是,如果您在那里找到一个因子,那么您已经找到了平方根下方的相应因子。

例如,3 x 1751 。如果您正在检查从 2 到 50 的数字以查看51是否是素数,您将首先找到3,这意味着您永远不需要检查17

int main (char argv) 
{
    int tempNum = atoi(argv);
    for (int i=3; i<=tempNum; i++) 
        for (int j=2; j*j<=i; j++)
        {
            if (i % j == 0) 
                break;
            else if (j+1 > sqrt(i)) {
                cout << i << " ";
            }
        }   
    return 0;
}

打印从 1 到 100 的质数基本上这个,但修改了

我发现这个非常快速和高效

 int main(){
    for(int i=3; i<=X; i++)    
            if(IsPrime(i)){
               cout<<i<<endl;
            }
    }
 bool IsPrime(int num){
    /* use commented part if want from 2
        if(num<=1)
            return false;
        if(num==2)
            return true;
    */
        if(num%2==0)
            return false;
        int sRoot = sqrt(num*1.0);
        for(int i=3; i<=sRoot; i+=2)
        {
            if(num%i==0)
                return false;
        }
        return true;
    }