Расчет для простых чисел с использованием квадратных корней и алгоритм построения запроса

Ниже приведен расчет простых чисел. Я пытался разобрать его, чтобы лучше понять петли. Кроме того, я хотел бы настроить эту функцию, чтобы найти простые числа, сравнивая число с его квадратным корнем вместо этого:

(предположим, что перед int main сделаны правильные объявления)

// Определяет, является ли число простым

bool isPrime (long n)
{
int a;

if (n == 1)
{
return false;
}

for (a = 2; a <= (n / 2); a++)
{
if ((n % a) == 0)
{
return false;
}

}
return true;
}

Однако, наблюдая за этим циклом, у меня возникает вопрос, правильно ли я наблюдаю за этой функцией для начала. Из того, что я вижу, похоже int a; является счетчиком, и он начинается с 2, так как 0 и 1 не являются простыми. n должно быть формальной переменной. Он утверждает, что для каждого числа, которое меньше или равно самому себе при делении на два, возвращает значение true для bool, если остаток больше нуля. В то же время, если число делится на два равномерно (то есть без остатка), то оно не считается простым (bool возвращает false). Звучит ли это правильно? Если нет, пожалуйста, дайте мне знать, где я сделал неправильный поворот. Если я правильно понял, перейдем ко второй половине программы.

Теперь здесь, primeCount; ограничено primeCount (2, 50000); в основном, но первая функция вводит здесь:

// Подсчитывает и упорядочивает простые числа с помощью функции isPrime

long primeCount (long x, long y)
{
bool prime;
int b;
int c = 1000;
int counter = 0;
int totalSum = 0;

for (b = 1; b <= y; b++)
{
prime = isPrime (b);

if (prime == true)
{
counter++;
}
if (b == c)
{
cout << setw(10) << left << (b - 999) << setw(10) << left << b << setw(12) << counter << endl;
cout << fixed << showpoint << setprecision(2) << endl;
totalSum = totalSum + counter;
counter = 0;
c = c + 1000;
}
}

Теперь я считаю, что x и y являются формальными переменными, но я не знаю, что x должен представлять. Это представляет int c; ? Цикл for в этой функции полностью смутил меня. Я не понимаю это Любой свет, который можно пролить на это, был бы оценен.

Что касается запроса на получение квадратного корня, нужно ли мне использовать 3 вложенных цикла для получения простых чисел?

 for (a > m => b)

for (a==m => b==m)

for (a < m => b>m)

Будет ли поиск простых чисел таким образом более или менее сложным, чем способ, показанный здесь? Я знаю, что это много для решения. Если вы, ребята, предложите мне разбить его на отдельные посты, я отредактирую этот и отправлю вторую половину в другом посте. Спасибо за помощь! Просто программист C ++ новичка, пытающийся сделать головы и хвосты из этого материала 🙂

0

Решение

Первая функция isPrime() делает то, что должен. Возвращает true, если число простое, и возвращает false, если это не так. Причина, по которой переменная цикла a работает только до n/2 потому что любое число n не может иметь фактор, который больше, чем n/2 (кроме себя). ПРИМЕРЫ? 6 -- 1, 2, 3 and 6, 12 -- 1, 2, 3, 4, 6 and 12, Цикл просто пытается увидеть, если a имеет какие-либо факторы (числа, которые делят его, не оставляя остаток). Если это так, то это не простое число (return false) иначе это (return true).

Однако я чувствую, что primeCount() не полностью делает то, для чего предназначен.

Из определения primeCount() Я думаю, что он предназначен для вычисления общего числа простых чисел из x в y (в вашем случае от 2 до 50000, так как вы упомянули main() звонки primeCount(2, 50000)). Однако для этого нужно for цикл должен быть изменен на это

for (b = x; b <= y; b++)

Роль переменной c здесь, чтобы сохранить проверку для каждого тысячного значения переменной цикла b,

Обратите внимание, что при первом запуске, когда b = 1000 т.е. b == c программа выводит количество простых чисел, с которыми оно сталкивалось до сих пор (counter). После этого counter сбрасывается на 0 а также c сейчас 2000.Затем, b продолжается от 1001 в 2000 и то же самое повторяется до b 50000

В целом, идея состоит в том, чтобы напечатать число простых чисел, которые существуют в каждой 1000 натуральных чисел из 2 в 50000,

1

Другие решения

for (a = 2; a <= (n / 2); a++)
{
if ((n % a) == 0)
{
return false;
}

}

Это цикл for, который вы используете. Он проверяет остаток от n при делении на каждое «а», итерируя от 2 до n / (половина (целое деление) от n). Если ЛЮБОЙ из этих остатков равен нулю, то n является составной, и нет смысла продолжать дальше. Мы просто возвращаем false — число не простое.

Можно с уверенностью предположить, что если мы не нашли делителя n до (n / 2), число является простым, поэтому ПОСЛЕ того, как мы попробуем все возможные предположения для делителей, если мы зашли так далеко, мы возвращаем, что число IS премьер.

0

По вопросам рекламы [email protected]