C ++查找从1到输入数字的所有素数

时间:2013-10-18 16:20:27

标签: c++ for-loop primes

所以重点是让程序找到并列出1和你输入的数字之间的所有素数。我使用number_test作为测试素数,除数和除数的数字。

我不确定是什么问题,对我而言,它在功能上与此处发布的程序相同:Printing prime numbers from 1 through 100 稍微改动一下(输入一个数字,将“i”改为小于输入的数字)。

我一直在寻找过去的三四天,而且我没有找到任何能够完全回答这个问题的东西,达到我上课所需的程度。非常感谢任何帮助。

#include iostream
#include conio.h
using namespace std;

void main(void){
//Declare variables
int number_entered;
//Get inputs    
cout << "This program lists all prime numbers from 1 through a positive number entered."
 << endl;
cout << "Please enter a positive integer."
 << endl;
cin >> number_entered;
cout << "Displaying all numbers from 1 to " << number_entered
 << endl
 << "Press any key to continue..."
 << endl;
getch();

for(int number_test = 2; number_test < number_entered; number_test++){
    for(int divisor = 2; divisor < number_test; divisor++){
        if(number_test % divisor == 0){
            break;
        }
        else if(number_test % divisor != 0){
            cout << number_test << " ";
            break;
        }
    }
}

getch();
}

9 个答案:

答案 0 :(得分:9)

你应该使用Eratosthenes的Sieve来计算小于 n 的素数。首先列出从2到最大所需素数 n 的所有数字。然后,在每个迭代步骤中,输出尚未考虑的最小剩余数,并将其所有倍数从列表中删除。

function primes(n)
    sieve := makeArray(2..n, True)
    for p from 2 to n step 1
        if sieve(p)
            output p
            for i from p*p to n step p
                sieve[i] := False

这个O(n log log n)算法非常快;你应该能够在不到一秒的时间内计算出不到一百万的78498素数。

答案 1 :(得分:2)

一个简单的C ++程序,用于查找“N”素数。

    #include  <iostream >
    using  namespace  std;

    int  main()
    {
        int  N;
        cin  >>  N;
        for (int  i =  2;  N > 0;  ++i)
        {
            bool  isPrime  =  true ;
            for (int  j =  2;  j < i;  ++j)
            {
                if (i  % j ==  0)
                {
                    isPrime  =  false ;
                    break ;
                }
            }
            if (isPrime)
            {
                --N;
                cout  <<  i  <<  "\n";
            }
        }
        return  0;
    }

答案 2 :(得分:2)

只是一个小建议。由于素数是奇数,所以可以省略偶数。 例如,在下面的循环中,i和j增加2(i + = 2)而不是1(i ++)。

for (int i=3;i<=numberByUser; i+=2){
    for (j=3;j<=i;j +=2){
        if (i%j==0){
            break;
        }
    }

答案 3 :(得分:1)

我认为在你的回答中任何一次循环终止(我正在谈论循环检查它是否是素数)一旦它出来你不知道它是否中断了。所以尝试制作一个标志变量并检查外部。我可以运行

for(n=lower+1; n<upper; n++)
 {
    prime = 1;
     for(i=2; i<n; i++)
       if(n%i == 0)
         {
          prime = 0;
           break;
          }
       if(prime)
        printf("\n\n\t\t\t%d", n);
 }

答案 4 :(得分:0)

for(int number_test = 2; number_test < number_entered; number_test++){
    for(int divisor = 2; divisor < number_test; divisor++){
        if(number_test % divisor == 0){
            break;
        }
        else if(number_test % divisor != 0){
            cout << number_test << " ";
            break;
        }
    }
}

上面的代码不会显示素数,它只会显示您输入的数字,当您遇到不是数字因子的除数时。例如,如果输入“9”,则从2开始,这不是9的因子,因此如果不是,则将“9”(错误地)显示为“素数”。

测试数字是否为素数的最简单方法是检查其平方根下面的所有素数,看它们是否是给定数字的因子。如果它们都不是(那么在给定数字之下的任何非素数都不是),则该数字是素数。如果它至少有一个素数因子小于或等于它的平方根,则它不是素数。

由于您希望显示[0,X]范围内的所有素数,您可以随时查看因子列表(或反向执行,这实际上是Eratosthenes的Sieve所做的)

答案 5 :(得分:0)

当我的观点与你的观点相似时,我写了这段代码,它有效。希望它会对你有所帮助。

#include <cstdio>
#include <vector>
using namespace std;

vector <int> sn;

bool isPrime(int n) {
        if (n <= 1) {
                return 0;
        }
        if (n == 2) {
                return true;
        }
        if (!(n % 2)) {
                return false;
        }
        for (int i = 2; i*i <= n; i++) {
                if (!(n % i)) {
                        return 0;
                }
        }
        return 1;
}

void primeNumbers(int k) {
        sn.push_back (2);
        int i = 3, j = 1;
        for ( ; j < k + 1; i += 2 && j++) {
                if (isPrime(i)) {
                        sn.push_back(i);
                }
        }
}

int main() {
        int i, k;
        scanf("%d", &k);
        primeNumbers(k);
        for (i = 0; i < sn.size(); i++) {
                printf("%d ", sn[i]);
        }
        return 0;
}

答案 6 :(得分:0)

int getNumberOfPrimes(int N) {
    bool *numbers = new bool[N-1]();

    for (int i = 2; i <= N/2; ++i) {
        if (numbers[i-2] == true) continue;

        for (int j = i+i; j <= N; j = j+i) {
            numbers[j-2] = true;
        }       
    }

    int count = 0;
    for (int i = 0; i < (N-1); ++i) {
        if (numbers[i] == false) ++count;
    }

    delete []numbers;
    return(count);
}

答案 7 :(得分:0)

男人,我想我有最简单的方法。希望它适合你!

#include < iostream >

using namespace std;

int main()
{
  int n, i, j
  cin>>n;  //The max limith
  for(i=2; i<=2; i++)
   {
     for(j=1; j<=i/2; j++)
      if(i%j!=o)
      cout<<i;
   }

 return 0;
}

答案 8 :(得分:0)

如果数字有除数,则其中至少有一个必须小于或等于数字的平方根。当你检查除数时,你只需要检查平方根,而不是一直到被测试的数字。