C ++ Prime Numbers程序

时间:2013-01-29 02:45:18

标签: c++ primes

我正在研究一个C ++程序,它确定并打印3到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 五 五 五 7 7 7 7 7 9

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

3 个答案:

答案 0 :(得分:1)

如果您的X足够小,您可以使用Eratosthenes的Sieve来更有效地完成它。这对于“素数达到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

答案 1 :(得分: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;
}

Printing prime numbers from 1 through 100 基本上这个,但修改了

答案 2 :(得分: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;
    }