C++ 在两个区间之间查找素数的函数

C++ 在两个区间之间查找素数的函数,c++,C++,我已经写了大部分程序,只是调试有困难。我对素数的计算一定出了问题。无论我尝试什么,它都说有0个素数。任何帮助都将不胜感激。代码和输出如下。 注意:对于这个程序,我不允许使用向量或数组 #include <iostream> #include <cmath> using namespace std; // FUNCTION PROTOTYPE FOR read_range void read_range(int &lower, int &upper

我已经写了大部分程序,只是调试有困难。我对素数的计算一定出了问题。无论我尝试什么,它都说有0个素数。任何帮助都将不胜感激。代码和输出如下。 注意:对于这个程序,我不允许使用向量或数组

#include <iostream>
#include <cmath>

using namespace std;

// FUNCTION PROTOTYPE FOR read_range
   void read_range(int &lower, int &upper);
// FUNCTION PROTOTYPE FOR is_prime
   bool is_prime(const int num);
// FUNCTION PROTOTYPE FOR display_primes
   void display_primes(const string &prime, const int lower, const int upper);
// DO NOT MODIFY THE MAIN ROUTINE IN ANY WAY
int main()
{
  int imin(0), imax(0);

  // Read in range
  read_range(imin, imax);

  // Print prime numbers
  cout << endl;
  display_primes("Primes: ", imin, imax);

  return 0;
}

// DEFINE FUNCTION read_range() HERE:
 void read_range(int &lower, int &upper){
     cout << "Enter minimum and maximum: "; 
     cin >> lower >> upper;
     while (lower < 2 || upper < 2 || lower > upper){
         if (lower < 2 || upper < 2) {
            cout << "Error. Minimum and maximum must be at least 2." << endl; }
         else if (lower > upper) {
            cout << "Error. Minimum must be less than maximum." << endl; } 
      cout << "Enter minimum and maximum: "; 
      cin >> lower >> upper; }}

// DEFINE FUNCTION is_prime() HERE:
 bool is_prime(const int num) {
     for (int i = 2; i <= sqrt(num); i++) {
         if (num % i == 0) {
            return 0; }             // Is not prime
         else {
            return 1; }}}           // Is prime

// DEFINE FUNCTION display_primes() HERE:
 void display_primes(const string &prime, const int lower, const int upper) {
   int count = 0;
   int commaCheck = 0;

   for (int i = lower; i <= upper; i++) {
      if (is_prime(i)) {
         count = count + 1; }}
         
   if (count == 1) {
      cout << "There is " << count << " prime number in this range." << endl; }
   else {
      cout << "There are " << count << " prime numbers in this range." << endl; }


   if (count != 0) {
      cout << prime;
      for (int i = lower; i <= upper; i++) {
         if (is_prime(i)) {
            if (count == 1) {
               cout << i;}
            else {
               commaCheck = commaCheck + 1; }
            if (commaCheck != count) {
               cout << i << ","; }
            else {
               cout << i; }}}
            cout << endl; }
   else {
      cout << "No primes to display." << endl; }}
is_prime有两个问题

如果sqrtnum小于2,则循环永远不会执行,并且函数在结束时没有返回编译器,因此函数具有未定义的行为,可能应该警告您此问题 如果数字不是偶数,那么在循环的第一次迭代中,您调用return1,这意味着所有奇数都将被标记为素数。 如果不是很有效,将循环更改为该循环将起作用,有更好的算法用于查找素数:

bool is_prime(const int num) {
    for (int i = 2; i <= sqrt(num); i++) {
        if (num % i == 0) {
            return false;
        }
    }
    return true;
}

这是检查两个区间之间有多少个数字是素数的默认算法之一,有很多选择,但这是我喜欢的,而且很短,很容易记住

#include <iostream>
using namespace std;

int main(){

    int i1min, i1max;
    int i, j, k = 0;
    bool primeTest;
    cin >> i1min;
    cin >> i1max;

    for(i=i1min; i<=i1max; i++) {
        primeTest = false;
        for (j=2; j<=i/2; j++) {
            if (i % j == 0) {
                primeTest = true;
                break;
            }
        }
        if (primeTest == false)
            k++;
    }

    cout << k;
    return 0;
}

这里的这条线是i=2的_素数;i sqrt2和2>sqrt3-因此循环不会对传入的范围执行。另外,如果UB-无法从非void函数返回值,编译器通常可以检查您的警告级别。您可能希望将sqrtnum存储到一个常量临时变量中,这样它就不会在每次迭代中执行。@Thomasmatthew还有很多其他低效率,可能不会有太大区别
#include <iostream>
using namespace std;

int main(){

    int i1min, i1max;
    int i, j, k = 0;
    bool primeTest;
    cin >> i1min;
    cin >> i1max;

    for(i=i1min; i<=i1max; i++) {
        primeTest = false;
        for (j=2; j<=i/2; j++) {
            if (i % j == 0) {
                primeTest = true;
                break;
            }
        }
        if (primeTest == false)
            k++;
    }

    cout << k;
    return 0;
}