嵌套的for循环和break

C++ Nested for loop and break

本文关键字:break 循环 for 嵌套      更新时间:2023-10-16

我是计算机科学的新手,有一个快速的问题。我试着编写一个程序,它可以输入两个整数,然后输出它们之间的所有质数。

我遇到的问题是,当我在嵌套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.nn";
    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;
}

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

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

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

更好的做法是,将对数字是否为素数的整个检查改为一个单独的函数,该函数返回bool值。

这应该教你如何编写具有单一职责的函数。你的函数循环遍历一串数字,对于每一个数字,它都会检查它是否是素数。后一部分属于一个单独的功能。有趣的是,如果您首先编写单独的函数,那么您的错误几乎不可能出现。

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

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

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

#include<cmath.h>