【问题标题】:C++ finding all prime numbers from 1 to a number enteredC ++查找从1到输入的数字的所有素数
【发布时间】:2013-10-18 16:20:27
【问题描述】:

所以关键是让程序找到并列出介于 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();
}

【问题讨论】:

  • void main 不是合法的 C++。我还假设您的真实代码在头文件名周围有尖括号。
  • 你应该在 stackoverflow.com 上搜索质数生成

标签: c++ for-loop primes


【解决方案1】:

您应该使用埃拉托色尼筛法来计算小于 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 个素数。

【讨论】:

    【解决方案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;
        }
    

    【讨论】:

      【解决方案3】:

      只是一个小建议。由于素数是奇数,偶数可以省略。 例如,在下面的循环中,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;
              }
          }
      

      【讨论】:

        【解决方案4】:

        我认为在你的回答中,有一次循环将终止(我说的是循环检查它是否是素数)一旦它出来你不知道它是否中断了。所以尝试制作一个标志变量并在外面检查。我认为它会起作用

        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);
         }
        

        【讨论】:

          【解决方案5】:
          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] 范围内的所有素数,因此您可以简单地检查您的因子列表(或者反过来进行,这实际上是埃拉托色尼筛法所做的) .

          【讨论】:

            【解决方案6】:

            当我的观点和你的观点一样时,我编写了这段代码,它奏效了。希望对你有帮助。

            #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;
            }
            

            【讨论】:

              【解决方案7】:
              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);
              }
              

              【讨论】:

                【解决方案8】:

                我想我有最简单的方法。希望它对你有用!

                #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;
                }
                

                【讨论】:

                  【解决方案9】:

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

                  【讨论】:

                    猜你喜欢
                    • 2014-07-21
                    • 2023-02-04
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-09-17
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多