2013-06-19 8 views
0

Я новичок в информатике и задал быстрый вопрос. Я пытался создать программу, которая будет принимать два целых ввода и распечатать все простые числа между ними.C++ Вложенный в цикл и перерыв

Проблема, с которой я столкнулась, заключается в том, что когда я использую break во вложенном цикле. После того, как он найдет простое число, он не попадет в цикл вложенных циклов при следующем обращении к внешнему циклу. Поэтому при поиске простых чисел от 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; 
} 
+2

После ввода через образец на бумаге или что-то было бы ясно показать вам эту проблему. – chris

ответ

3

Проблема в том, что вы не сбрасываете значение i. Изменение цикла для:

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

И удалить ранее определение из i, так как она не нужна в этой точке.

Еще лучше, измените всю проверку того, является ли число простым для отдельного funcion, которое возвращает bool.

Это должно научить вас написать функции с одной ответственностью. Ваша функция проходит через кучу чисел, и для каждого из них она проверяет, является ли она простым. Эта последняя часть принадлежит отдельной функции. Интересно, что ваша ошибка вряд ли появится, если вы напишете отдельные функции в первую очередь.

+0

Отлично, спасибо, ребята. – Peter

+1

Жаль, что я мог +2 последних двух абзацев. – molbdnilo

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> 
Смежные вопросы