Упражнения

A: Медиана трех чисел

Напишите функцию int median(int a, int b, int c), которая получает на вход три числа и возвращает их медиану (среднее из трёх значений).

Сдайте на проверку только тело функции.

Вызов функции Возвращаемое значение
median(1, 9, 7)
7

B: Принадлежит ли точка квадрату - 1

Даны два действительных числа \(x\) и \(y\). Проверьте, принадлежит ли точка с координатами \((x,y)\) заштрихованному квадрату (включая его границу). На рисунке сетка проведена с шагом 1.

Решение оформите в виде функции bool is_point_in_square(double x, double y), возвращающую true, если точка принадлежит квадрату и false, если не принадлежит.

Функция is_point_in_square не должна содержать инструкцию if.

Сдайте на проверку только тело функции.

Вызов функции Возвращаемое значение
is_point_in_square(0, 0)
true
is_point_in_square(3, -7)
false

C: Принадлежит ли точка квадрату - 2

Решите аналогичную задачу для такого квадрата:

Решение должно соответствовать требованиям для решения задачи C.

Функция должна называться is_point_in_rhombus.

Вызов функции Возвращаемое значение
is_point_in_rhombus(0, 0)
true
is_point_in_rhombus(1, 1)
false

D: Принадлежит ли точка кругу

Даны пять действительных чисел: \(x\), \(y\), \(x_c\), \(y_c\), \(r\). Проверьте, принадлежит ли точка \((x,y)\) кругу с центром \((x_c,y_c)\) и радиусом \(r\).

Решение оформите в виде функции bool is_point_in_circle(double x, double y, double xc, double yc, double r).

Решение должно соответствовать требованиям для решения задачи C.

Вызов функции Возвращаемое значение
is_point_in_circle(0.5, 0.5, 0, 0, 1)
true
is_point_in_circle(0.5, 0.5, 1, 1, 0.1)
false

E: Принадлежит ли точка области

Проверьте, принадлежит ли точка данной закрашенной области. Область неограничена снизу.

Решение оформите в виде функции bool is_point_in_area(double x, double y).

Решение должно соответствовать требованиям для решения задачи С.

Вызов функции Возвращаемое значение
bool is_point_in_area(-1, 2)
true
bool is_point_in_area(0, 0)
false

F: Разверните число

Дано число, получите число, составленное из тех же цифр, записанных в обратном порядке.

Решение оформите в виде функции int reverse(int n), которая получает на вход значение типа int и возвращает значение типа int.

Вызов функции Возвращаемое значение
reverse(179)
971

G: Минимальный делитель числа

Дано натуральное число \(n>1\). Найдите его наименьший делитель, отличный от 1.

Решение оформите в виде функции long long min_divisor(long long n). Алгоритм должен иметь сложность \(O(\sqrt{n})\). Обратите внимание на используемый тип данных.

Указание. Если у числа \(n\) нет делителя не превосходящего \(\sqrt{n}\), то число \(n\) — простое и ответом будет само число \(n\).

Сдайте на проверку только тело функции.

Вызов функции Возвращаемое значение
min_divisor(4)
2
min_divisor(5)
5

H: Проверка числа на простоту

Дано натуральное число \(n>1\). Проверьте, является ли оно простым. Программа должна вывести слово YES, если число простое и NO, если число составное.

Решение оформите в виде функции bool is_prime(long long n), которая возвращает true для простых чисел и false для составных чисел. Решение должно иметь сложность \(O(\sqrt{n})\).

Сдайте на проверку только тело функции.

Вызов функции Возвращаемое значение
is_prime(2)
true
is_prime(4)
false

I: Сократите дробь

Даны два натуральных числа \(n\) и \(m\). Сократите дробь \(\frac{n}{m}\), то есть выведите два других числа \(p\) и \(q\) таких, что \(\frac{n}{m}=\frac{p}{q}\) и дробь \(\frac{p}{q}\) — несократимая.

Решение оформите в виде функции void reduce_fraction(int & n, int & m), получающая значения n и m по ссылке и изменяющая их.

Сдайте на проверку только тело функции.

Значения n, m до вызова Значения n, m после вызова reduce_fraction(n, m)
\(n=12\), \(m=16\) \(n=3\), \(m=4\)

J: Деление с остатком

Мнение конструкторов ЭВМ и математиков о том, что такое деление с остатком для отрицательных чисел расходится. Напомним, что при делении числа \(a\) на число \(b\) с остатком находятся такие числа \(q\) (частное) и \(r\) (остаток), что \(a=qb+r\). При этом \(|r|<|b|\). Если числа \(a\) и \(b\) — положительные, то выполняется более сильное неравенство: \(0 \le r < b\) и тогда деление с остатком определяется однозначно. Но если числа — отрицательные то деление с остатком на компьютере выполняется не так, как это кажется правильным математикам.

Вот как выполняется деление с остатком на компьютере для отрицательных чисел:

a
b
a / b
a % b
26
10
2
6
-26
10
-2
-6
26
-10
-2
6
-26
-10
2
-6

Таким образом, в компьютере целочисленное частное является результатом округления действительного частного в сторону нуля, как это делает функция trunc. Между тем, математик считает, что целочисленное частное — это целая часть от частного \((q=\lfloor a/b\rfloor)\), то есть результат использования функции floor. Это даст такие результаты с точки зрения математики:

\(a\) \(b\) \(\lfloor a / b\rfloor\) \(a \bmod b\)
26
10
2
6
-26
10
-3
4
26
-10
-3
-4
-26
-10
2
-6

Напишите программу, которая по данным числам \(a\) и \(b\) вычисляет их целочисленное частное и остаток от деления так, как это принято в математике. Программа не должна использовать действительные числа и циклы.

Решение оформите в виде функции void div_mod(int a, int b, int & q, int & r), где a — делимое, b — делитель, q — переменная для записи частного, r — переменная для записи остатка.

Сдайте на проверку только тело функции.

Значения \(a\), \(b\) до вызова Значения \(q\), \(r\) после вызова
\(a=-26\), \(b=10\) \(q=-3\), \(r=4\)
\(a=26\), \(b=-10\) \(q=-3\), \(r=-4\)

K: Упорядочить четыре числа

Дано четыре целых числа \(a\), \(b\), \(c\), \(d\). Упорядочите эти числа в порядке неубывания, то есть необходимо переставить их значения так, чтобы \(a\le b\le c\le d\). Решение оформите в виде функции void sort(int & a, int & b, int & c, int & d).

Функция должна содержать только операции вида

if (a > b)
    swap(a, b);

Вложенные инструкции if не допускаются. Внутри одной инструкции if может быть только один swap. Ветки else тоже использовать не нужно.

Сдайте на проверку только тело функции.

Значения \(a\), \(b\), \(c\), \(d\) до вызова Значения после вызова sort(a, b, c, d)
\(a=3\), \(b=2\), \(c=4\), \(d=1\) \(a=1\), \(b=2\), \(c=3\), \(d=4\)

K+: Минимальное число обменов (задача на подумать)

Какое наименьшее количество обменов может содержать решение предыдущей задачи?