# Алгоритмы решения прикладных задач, 1-й семестр, 2-я практика ## Задания ### Задание 1 Написать программу для поиска наибольшего общего делителя (числа вводятся с клавиатуры после запуска программы): Нечетные варианты: наибольший делитель трех чисел методом деления (для поиска остатка отделения в языке C++ используется операция %) Четные варианты: наибольший общий делитель четырех чисел метолом вычитания ```cpp // Функция для нахождения НОД двух чисел (метод деления) int gcdDivision(int a, int b) { while (b != 0) { int temp = b; b = a % b; a = temp; } return a; } // Функция для нахождения НОД трех чисел int gcdOfThreeNumbers(int x, int y, int z) { return gcdDivision(gcdDivision(x, y), z); } // Функция для нахождения НОД двух чисел методом вычитания int gcdSubtraction(int a, int b) { while (a != b) { if (a > b) { a -= b; } else { b -= a; } } return a; // или b, так как a == b } // Функция для нахождения НОД четырех чисел int gcdOfFourNumbers(int w, int x, int y, int z) { return gcdSubtraction(gcdSubtraction(gcdSubtraction(w, x), y), z); } ``` ### Задание 2 Написать программу для факторизации заданного с клавиатуры числа методом простого перебора (указать простые множители и их кратность). Для анализа числа на простоту использовать решето Эратосфена ```cpp #include #include #include "sieveoferatosthenes.cpp" // Функция для факторизации числа (метод простого перебора) std::map factorize(int number) { std::map factors; std::vector primes = sieveOfEratosthenes(number); for (int prime : primes) { if (prime * prime > number) break; while (number % prime == 0) { factors[prime]++; number /= prime; } } if (number > 1) { factors[number]++; } return factors; } ```