Программа для поиска простых чисел неожиданно останавливается

0

Я написал очень простую программу для поиска простых чисел до определенного диапазона, указанного пользователем. Но я столкнулся с проблемой. Программа просто перестает печатать простые числа, когда достигает составного числа. Я попытался понять, почему это останавливается, но я просто не могу понять, что с ним не так, потому что я новичок в программировании. Во всяком случае, вот код.

#include <iostream>
using namespace std;
int main()
{
    int y;
    int range;
    cout << "Please enter the range. \n";
    cin >> range;
    for (y = 2; y <= range; y++)
    {
        int result;
        for (int x = 1; x < y - 1; x++)
        {
            int prime = y - x;
            if (y%prime != 0)
            {

            }
            else
            {
                result = 0;
            }
        }
        if (result != 0)
        {
            cout << y << " is a prime number. \n";
        }
    }
}
  • 2
    result может быть использован без инициализации
  • 0
    Вы должны инициализировать результат с ненулевым целым числом, int result = 1;
Показать ещё 2 комментария
Теги:
for-loop
numbers

2 ответа

5
Лучший ответ

Как отмечает Брайан Градин, единственная проблема, которую я вижу, заключается в том, что вы должны инициализировать результат с ненулевым целым числом.

int result = 1;

Только после этой инициализации вы можете сделать правильную проверку после цикла for, изменился ли результат на ноль.

Без инициализации любой доступ к значению этой переменной приводит к неопределенному поведению.

РЕДАКТИРОВАТЬ:

Для полноты я должен добавить предложения других, что более стандартный способ сделать это:

for (y = 2; y <= range; y++)
{
  bool isPrime = true;

  // The following loop should be changed to loop through the Sieve of primes
  for (int x = 2; x*x < y ; x++) // You need to loop only till sqrt(y)
  {
    if (y%x == 0) // if you found a factor
    {
      isPrime = false;
      break;
    }
  }
  if ( isPrime )
  {
    cout << y << " is a prime number. \n";
    // and add this to the sieve of primes.
  }
}
  • 2
    Я могу подтвердить, что оригинальный код будет работать после внесения изменений. +1
  • 0
    эй, ты прав .. !! я тоже ходил .. !!
Показать ещё 2 комментария
0
int main()
{
    int y;
    int range;
    int result;
    int prime;
    cout << "Please enter the range. \n";
    cin >> range;
    for (y = 2; y <= range; y++)
    {
       result=1;
        for (int x = 1; x <= y - 1; x++)
        {
             prime = y - x;
            if (y%prime != 0)
            {

            }
            else
            {
                result = 0;
            }
        }
        if (result != 0)
        {
            cout << y << " is a prime number. \n";
        }
    }
}

я изменил ваше выражение о запрете forloops.. !!

 for (int x = 1; x <= y - 1; x++)

и измените свои объявления на верх:

int result=0;
    int prime;
  • 1
    Я вижу, что вы там сделали, но это может быть полезно объяснить для ОП или других
  • 0
    Пожалуйста, инициализируйте result во что-нибудь, это заставляет меня нервничать. Что-то, кроме нуля.
Показать ещё 13 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню