С++ Разработать модуль для работы с обыкновенными дробями,
числителем и знаменателем которых являются длинные числа.
В модуле должны быть представлены следующие операции:
сложение;
вычитание;
умножение;
деление;
сокращение;
выделение целой части;
отношения в виде логических функций.
Используя разработанный модуль, найти разность минималь-
ного и максимального элементов заданного массива обыкновен-
ных дробей.
Ответы
Ответ:
Для реализации модуля для работы с обыкновенными дробями с длинными числами в качестве числителя и знаменателя, можно использовать класс Fraction, который будет содержать поля для числителя и знаменателя, а также методы для выполнения операций над дробями. Вот пример реализации такого класса на языке C++:
Объяснение:
#include <iostream>
#include <string>
#include <algorithm>
#include <numeric>
#include <cmath>
class Fraction {
public:
Fraction(long long num = 0, long long den = 1) {
numerator = num;
denominator = den;
reduce();
}
long long getNumerator() const {
return numerator;
}
long long getDenominator() const {
return denominator;
}
Fraction operator+(const Fraction& other) const {
long long lcm = std::lcm(denominator, other.denominator);
long long num = numerator * lcm / denominator + other.numerator * lcm / other.denominator;
return Fraction(num, lcm);
}
Fraction operator-(const Fraction& other) const {
long long lcm = std::lcm(denominator, other.denominator);
long long num = numerator * lcm / denominator - other.numerator * lcm / other.denominator;
return Fraction(num, lcm);
}
Fraction operator*(const Fraction& other) const {
long long num = numerator * other.numerator;
long long den = denominator * other.denominator;
return Fraction(num, den);
}
Fraction operator/(const Fraction& other) const {
long long num = numerator * other.denominator;
long long den = denominator * other.numerator;
return Fraction(num, den);
}
Fraction reduce() {
long long gcd = std::gcd(numerator, denominator);
numerator /= gcd;
denominator /= gcd;
if (denominator < 0) {
numerator = -numerator;
denominator = -denominator;
}
return *this;
}
int integerPart() const {
return numerator / denominator;
}
bool operator==(const Fraction& other) const {
return numerator == other.numerator && denominator == other.denominator;
}
bool operator!=(const Fraction& other) const {
return !(*this == other);
}
bool operator<(const Fraction& other) const {
long long lcm = std::lcm(denominator, other.denominator);
return numerator * lcm / denominator < other.numerator * lcm / other.denominator;
}
bool operator<=(const Fraction& other) const {
return *this < other || *this == other;
}
bool operator>(const Fraction& other) const {
return !(*this <= other);
}
bool operator>=(const Fraction& other) const {
return !(*this < other);
}
private:
long long numerator;
long long denominator;
};
std::ostream& operator<<(std::ostream& out, const Fraction& f) {
out << f.getNumerator() << "/" << f.getDenominator();
return out;
}
Fraction maxFraction(const Fraction* fractions, int size) {
Fraction max = fractions[0];
for (int i = 1; i < size; ++i) {
if (fractions[i] > max) {
max = fractions[i];
}
}
return max;
}
Fraction minFraction(const Fraction* fractions, int