Ниже приведен расчет простых чисел. Я пытался разобрать его, чтобы лучше понять петли. Кроме того, я хотел бы настроить эту функцию, чтобы найти простые числа, сравнивая число с его квадратным корнем вместо этого:
(предположим, что перед 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 ++ новичка, пытающийся сделать головы и хвосты из этого материала 🙂
Первая функция 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
,
for (a = 2; a <= (n / 2); a++)
{
if ((n % a) == 0)
{
return false;
}
}
Это цикл for, который вы используете. Он проверяет остаток от n при делении на каждое «а», итерируя от 2 до n / (половина (целое деление) от n). Если ЛЮБОЙ из этих остатков равен нулю, то n является составной, и нет смысла продолжать дальше. Мы просто возвращаем false — число не простое.
Можно с уверенностью предположить, что если мы не нашли делителя n до (n / 2), число является простым, поэтому ПОСЛЕ того, как мы попробуем все возможные предположения для делителей, если мы зашли так далеко, мы возвращаем, что число IS премьер.