Пример 2. Проверка на простое число с использованием цикла for

Лабораторная №3

Циклы в С++

Инструкция for предоставляет именно механизм, позволяющий указать инициализатор, условие п инкремент.

· инициализатор: вычисляется всего 1 раз перед началом цикла

· условие

· инкремент: вычисляется каждый раз после выполнения тела цикла

for (i = 1;i <= 10;i++)

cout<<i<<"

Такая запись является не только более сжатой, но и более аккуратной. Все параметры, управляющие выполнением цикла, располагаются в круглых скобках. Более формально, вот синтаксис инструкции for вместе с эквивалентным циклом, использующим инструкцию while.

Пример 1. Печать целых чисел от 10 до 20.

for(i=10;i<=20;i++)

cout << i << " ";

В результате получим:

10 11 12 13 14 15 16 17 18 19 20

Упражнение 1. Используйте инструкцию for в программе, которая печатает все числа в диапазоне от n1 до n2, где n1 и n2 - это два числа, введенных пользователем.

Упражнение 2. Перепишите пример таким образом, чтобы числа от n до 1 печатались в обратном порядке. Например, пользователь ввел число 5 и программа напечатала 5 4 3 2 1. (Подсказка: в цикле, образованном при помощи инструкции for, проинициализируйте переменную i значением n, используйте в условии i >= 1 и вычитайте 1 из значения переменной i на шаге инкремента.)

 

Пример 2. Проверка на простое число с использованием цикла for

Программа определяет, является ли введенное число простым. (Вспомните, что число является простым, если оно делится без остатка только на само себя и единицу.)

 

Логика проверки на простое число следующая:

Установить значение переменной i в 2.

Пока значение переменной i меньше или равно квадратному корню числа n,

Если число n делится без остатка на значение переменной i,

Число n не является простым.

Прибавить 1 к значению переменной i.

 

Для (инструкция for) всех целых чисел от 2 до квадратного корня числа n,

Если число n делится без остатка на значение переменной i,

Число n не является простым.

 

#include <iostream>

#include <math.h>

using namespace std;

 

int main() {

int n; // Число

int i; // Счетчик

int is_prime; // Флаг того, является ли число простым

 

is_prime = true;

 

// Введем с клавиатуры число

cout << "Enter a number and press ENTER: ";

cin >> n;

 

// Цикл

for (i = 2; i <= sqrt((double) n); i++) {

if (n % i == 0)

is_prime = false;

}

// Печать результатов

if (is_prime)

cout << "Number is prime.";

else

cout << "Number is not prime.";

return 0;

}

 

Примечание: sqrt((double) n) – квадратный корень из n.

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

В любом случае, следующие изменения в коде помогут сделать программу более эффективной при работе с большими числами:

Вычисляйте квадратный корень числа n только один раз, объявив переменную square_root_of_n и определив ее значение перед входом в цикл for. Чтобы избежать предупреждений компилятора, необходимо объявить переменную типа double.

Как только найден делитель числа n, нет необходимости продолжать поиск. Поэтому, в инструкцию if внутри цикла добавьте инструкцию break (прерывающую выполнение цикла) после установки значения переменной is_prime в значение false.

Упражнение 4. Посчитать

a)

b)

Пользователь вводит x (переменная x должна быть объявлена как double).