繁体   English   中英

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

[英]How can I display only prime numbers in this code?

我正在尝试使用此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 <<; 
    }
}

问题是我认为逻辑越来越接近,但是那些三三两两在素数之间不断出现。 我究竟做错了什么?

我已经修复了您的代码,并在进行更改的地方添加了注释

此处的关键是要理解,如果其中一个数除以“ 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;  
    }
}

已经给出了许多答案,说明了如何执行此操作。 没有人回答这个问题:

我究竟做错了什么?

因此,我将尝试一下。

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

您的代码中有多个错误。

最简单的算法(虽然不是最佳算法)是用于检查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;
        }
    }
}

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

因此在这里,对于质数的想法有很多“获取质数bf数”的方法,有些方法更好一些,有些则更糟。

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
}

小注释,我从这里开始为Sive获取了简单的实现代码(编写此注释的目的不是非法的,事实是想告诉它以易于查找)

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

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

然后,将for循环简化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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM