如何在此代码中仅显示素数?

时间:2016-02-29 20:14:28

标签: c++ loops

我正在尝试使用此c ++代码获取范围为2的所有素数和输入的值:

#include<iostream>
using namespace std;

int main() {
    int num = 0;
    int result = 0;

    cin >> num;

    for (int i = 2; i <= num; i++) {    
        for (int b = 2; b <= num; b++) {
            result = i % b;

            if (result == 0) {
                result = b;
                break;
            }              
        }

        cout << result<< endl <<; 
    }
}

问题在于我认为接近逻辑,但是那些三分之二和二十分之一仍然出现在素数之间。我做错了什么?

5 个答案:

答案 0 :(得分:1)

我修改了你的代码,并在我做了更改的地方添加了评论

这里的关键是要理解你需要检查所有小于“i”的数字,如果其中一个除以“i”,如果是,则将数字标记为非素数和中断(中断只是优化)

然后只打印那些通过“测试”的人(最初打印过所有内容)

#include <iostream>
using namespace std;

#include<iostream>
using namespace std;

int main() 
{
    int num = 0;
    int result = 0;

    cin >> num;

    for (int i = 2; i <= num; i++) {
       bool isPrime = true; // Assume the number is prime

       for (int b = 2; b < i; b++) { // Run only till "i-1" not "num"
            result = i % b;

            if (result == 0) {
                isPrime = false; // if found some dividor, number nut prime
                break;
               }

       }

      if (isPrime) // print only primes
          cout << i << endl;  
    }
}

答案 1 :(得分:1)

已经给出了许多答案,解释了如何做到这一点。没有人回答这个问题:

  

我做错了什么?

所以我会尝试一下。

#include<iostream>
using namespace std;

int main() {
    int num = 0;
    int result = 0;

    cin >> num;

    for (int i = 2; i <= num; i++) {    
        for (int b = 2; b <= num; b++) {  // wrong: use b < i instead of b <= num
            result = i % b;

            if (result == 0) {
                result = b;  // wrong: why assign result the value of b?
                             // just remove this line
                break;
            }              
        }

        cout << result<< endl <<; // wrong: you need a if-condtion before you print
                                  // if (result != 0) cout << i << endl;
    }
}

答案 2 :(得分:0)

您的代码中有多处错误。

最简单的算法(虽然不是最优的算法)是检查N是否是正则只是为了检查它是否在范围内没有任何分频器[2; N-1]。

这是工作版本:

int main() {
    int num = 0;

    cin >> num;

    for (int i = 2; i <= num; i++) {
        bool bIsPrime = true;
        for (int b = 2; bIsPrime && b < i; b++) {
            if (i % b == 0) {
                bIsPrime = false;
            }
        }

        if (bIsPrime) {
            cout << i << endl;
        }
    }
}

答案 3 :(得分:0)

我几乎可以猜测它的学术任务:)

所以在这里考虑素数有很多方法可以获得数字&#34;有些人更糟糕一些。

Erosthenes Sieve - 是其中之一,它非常简单的概念,但在大数字(如数百万)的情况下效率更高,因为OopsUser版本是正确的你可以尝试看看自己是什么版本更好

void main() {
  int upperBound;
  cin >> upperBound;

  int upperBoundSquareRoot = (int)sqrt((double)upperBound);
  bool *isComposite = new bool[upperBound + 1]; // create table
  memset(isComposite, 0, sizeof(bool) * (upperBound + 1)); // set all to 0

  for (int m = 2; m <= upperBoundSquareRoot; m++) {
        if (!isComposite[m]) { // if not prime
              cout << m << " ";
              for (int k = m * m; k <= upperBound; k += m) // set all multiplies
                    isComposite[k] = true;
        }
  }

  for (int m = upperBoundSquareRoot; m <= upperBound; m++) // print results
        if (!isComposite[m])
              cout << m << " ";

  delete [] isComposite; // clean table
}

小注意,我从here为Sive提供了简单的实现代码(写下这个注释,因此它不是非法的,真相被告知想要显示它很容易找到)

答案 4 :(得分:0)

我建议删除确定数字是否是单独函数的素数的逻辑,从main调用函数然后相应地创建输出。

// Declare the function
bool is_prime(int num);

然后,将for循环简化为:

for (int i = 2; i <= num; i++) { 
   if ( is_prime(i) )
   {
      cout << i << " is a prime.\n"; 
   }   
}

然后实施is_prime

bool is_prime(int num)
{
   // If the number is even, return true if the number is 2 else false.
   if ( num % 2 == 0 )
   {
      return (num == 2);
   }

   int stopAt = (int)sqrt(num);

   // Start the number to divide by with 3 and increment it by 2.
   for (int b = 3; b <= stopAt; b += 2)
   {
      // If the given number is divisible by b, it is not a prime
      if ( num % b == 0 )
      {
         return false;
      }
   }

   // The given number is not divisible by any of the numbers up to 
   // sqrt(num). It is a prime
   return true;
}