Files
ARPZ-s1-pr2/README.md
2024-10-26 09:21:38 +03:00

2.6 KiB
Raw Blame History

Алгоритмы решения прикладных задач, 1-й семестр, 2-я практика

Задания

Задание 1

Написать программу для поиска наибольшего общего делителя (числа вводятся с клавиатуры после запуска программы): Нечетные варианты: наибольший делитель трех чисел методом деления (для поиска остатка отделения в языке C++ используется операция %) Четные варианты: наибольший общий делитель четырех чисел метолом вычитания

// Функция для нахождения НОД двух чисел (метод деления)
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

Написать программу для факторизации заданного с клавиатуры числа методом простого перебора (указать простые множители и их кратность). Для анализа числа на простоту использовать решето Эратосфена

#include <vector>
#include <map>

#include "sieveoferatosthenes.cpp"

// Функция для факторизации числа (метод простого перебора)
std::map<int, int> factorize(int number) {
  std::map<int, int> factors;
  std::vector<int> 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;
}