-1

我正在开发一个 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”时,我得到输出:3 5 5 5 7 7 7 7 7 9

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

4

3 回答 3

1

如果您X的体积足够小,您可以使用 Eratosthenes 筛来更有效地完成此操作。这对于“素数达到 X”的情况是理想的,因为它保留了以前丢弃的素数的内存。它通过为每个候选编号保留一组标志来做到这一点,所有这些标志最初都设置为真(当然除了 1)。

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

然后继续:

  • 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.

于 2013-01-29T02:53:07.657 回答
0

我发现这个非常快速有效

 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;
    }
于 2013-01-29T02:56:28.920 回答
0
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 的素数 基本上是这个,但经过修改

于 2013-01-29T02:51:40.730 回答