0

我是计算机科学的新手,有一个快速的问题。我试图制作一个程序,该程序将接受两个整数输入并打印出它们之间的所有素数。

我遇到的问题是,当我在嵌套的 for 循环中使用 break 时。在它找到一个素数后,它不会在外部 for 循环的下一次循环中命中嵌套的 for 循环。因此,当搜索 8 到 15 之间的素数时,它会打印出“11 12 13 14 15”。一开始它是正确的,但是在找到一个素数之后,它表明其余的有界数也是素数。

#include <iostream>
using namespace std;

int main()
{
    // Prime number finder:
    cout << "Enter two numbers and I will find the prime numbers between them.\n\n";

    int num1, num2, i = 2;
    bool valid;

    cout << "Enter the lower limit: ";
    cin >> num1;
    cout << endl << "Enter the higher limit: ";
    cin >> num2;
    if (num2 <= num1)
    {
        cout << "Enter a number that is larger than the lower limit./n";
    }

    if (num1 <= 1)
    {
        cout << "1 2 ";
        num1 = 3;
    }
    else if (num1 == 2)
    {
        cout << "2 ";
        num1 = 3;
    }

    for (num1; num1 <= num2; num1++)
    {
        valid = true;

        for (i; i < num1; i++)
        {
            if ((num1 % i) == 0)
            {
                valid = false;
                break;
            }
        }

        if (valid == true)
            cout << num1 << " ";
    }

    return 0;
}
4

2 回答 2

3

问题是您没有重置 i 的值。将循环更改为:

for (int i = 2; i < num1; i++)

并删除您之前对 的定义i,因为此时不需要它。

更好的是,将数字是否为素数的整个检查更改为返回布尔值的单独函数。

这应该教会您编写具有单一职责的函数。您的函数遍历一堆数字,并为每个数字检查它是否是素数。后一部分属于单独的功能。有趣的是,如果您首先编写单独的函数,那么您的错误极不可能出现。

于 2013-06-19T05:39:54.990 回答
1

在下面的 for 循环中 i 未初始化,您必须设置i=2,还将上限设置为sqrt(num1)

for (i=2; i <= sqrt(num1); i++)
{
        if ((num1 % i) == 0)
    {
        valid = false;
        break;
    }
}

要使用sqrt()还包括以下头文件,如下所示,

#include<cmath.h>
于 2013-06-19T05:43:14.887 回答