From b10dc7ab4c7615b16810276a9f9cb2fe2c573d85 Mon Sep 17 00:00:00 2001 From: Angel Dimitriev Date: Fri, 2 Apr 2021 13:11:05 +0300 Subject: Add files via upload --- Sem. 05/Interval/Interval.cpp | 133 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 Sem. 05/Interval/Interval.cpp (limited to 'Sem. 05/Interval/Interval.cpp') diff --git a/Sem. 05/Interval/Interval.cpp b/Sem. 05/Interval/Interval.cpp new file mode 100644 index 0000000..c3f11cf --- /dev/null +++ b/Sem. 05/Interval/Interval.cpp @@ -0,0 +1,133 @@ +#include +#include +#include "Interval.h" + +bool isPrime(int n) +{ + double temp = sqrt(n); + for (int i = 2; i <= temp; i++) + { + if (n % i == 0) + return false; + } + return true; +} + +bool isPalindorme(int n) +{ + int reversed = 0; + + while (n != 0) + { + int lastDigit = n % 10; + (reversed *= 10) += lastDigit; + n /= 10; + } + return n == reversed; +} +bool containsOnlyDistinctNumbers(int n) +{ + bool digits[10]; + for (int i = 0; i < 10; i++) + digits[i] = false; + + while (n != 0) + { + int lastDigit = n % 10; + if (digits[lastDigit]) + return false; + digits[n % 10] = true; + n /= 10; + } + return true; +} + +size_t Interval::countNumbersInIntervalCondition(bool(*pred)(int)) const +{ + size_t count = 0; + for (int i = a; i <= b; i++) + { + if (pred(i)) + count++; + } + return count; +} + +Interval::Interval() : Interval(0, 0) {} + +Interval::Interval(int a, int b) +{ + if (a > b) + a = b = 0; + + this->a = a; + this->b = b; +} + +int Interval::getA() const +{ + return a; +} + +int Interval::getB() const +{ + return b; +} +void Interval::setA(int a) +{ + if (a > b) + return; + this->a = a; +} + +void Interval::setB(int b) +{ + if (b < a) + return; + this->b = b; +} + +size_t Interval::getLength() const +{ + return b - a + 1; +} + +bool Interval::isMemberOfInterval(int x) const +{ + return (a <= x && x <= b); +} + +size_t Interval::calcPrimeNumbersInTheInterval() const +{ + return countNumbersInIntervalCondition(isPrime); +} + +size_t Interval::calcPalindromicNumbersInTheInterval() const +{ + return countNumbersInIntervalCondition(isPalindorme); +} + +size_t Interval::calcDiffrentDigitNumbersInTheInverval() const +{ + return countNumbersInIntervalCondition(containsOnlyDistinctNumbers); +} + +bool Interval::areStartAndEndPowersOfTwo() const +{ + return (a == 0 || (a & a - 1) == 0) && (b == 0 || (b & b - 1) == 0); +} + +Interval Interval::intersect(const Interval& other) const +{ + if (b < other.getA() || a > other.getB()) + return Interval(0, 0); + + int newA = std::max(a, other.getA()); + int newB = std::min(b, other.getB()); + + return Interval(newA, newB); +} +bool Interval::isSuperInterval(const Interval& other) const +{ + return a <= other.getA() && b >= other.getB(); +} \ No newline at end of file -- cgit v1.3.1-23-gd82d