Advertisement
Gistrec

Число, хранящееся в виде массива множителей

Jun 10th, 2019
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.94 KB | None | 0 0
  1. /**
  2.  * Класс Variable реализует целое положительное число,
  3.  * представленное в виде массива его простых множителей.
  4.  *
  5.  * Так же перегружены основные операторы (+ - * /)
  6.  */
  7.  
  8.  
  9. #pragma once
  10. #include <vector>
  11. #include <iostream>
  12. #include <algorithm>
  13.  
  14.  
  15. using std::vector;
  16. using std::ostream;
  17.  
  18.  
  19. // Получить массив простых множителей числа
  20. vector<int> getPrimeFactors(int var) {
  21.     vector<int> result;
  22.     int div = 2;
  23.     while (var > 1) {
  24.         while (var % div == 0) {
  25.             result.push_back(div);
  26.             var = var / div;
  27.         }
  28.         // Из четных простых делителей числа может быть только 2
  29.         if (div == 2) div++;
  30.         else div += 2;
  31.     }
  32.     return result;
  33. }
  34.  
  35.  
  36. class Variable {
  37. private:
  38.     vector<int> _dividers; // Массив с делителями числа
  39.     int _sign = +1; // Знак числа (либо +1, либо -1)
  40.  
  41. public:
  42.     Variable(int var) {
  43.         // Если передали 0
  44.         if (var == 0) {
  45.             _dividers.push_back(0);
  46.             return;
  47.         }
  48.  
  49.         // Если передали отризательное число
  50.         if (var < 0) {
  51.             _sign = -1;
  52.             var = -var;
  53.         }
  54.         _dividers = getPrimeFactors(var);
  55.     }
  56.  
  57.     Variable(vector<int> &dividers, int sign) {
  58.         _dividers = dividers;
  59.         _sign = sign;
  60.     }
  61.  
  62.     vector<int> getDividers() const {
  63.         return _dividers;
  64.     }
  65.  
  66.     int toInt() const {
  67.         int result = _sign;
  68.         // Умножаем знак на каждое число в векторе
  69.         std::for_each(_dividers.begin(), _dividers.end(), [&](int n) { result *= n; });
  70.         return result;
  71.     }
  72.  
  73.     int getSign() const {
  74.         return _sign;
  75.     }
  76.  
  77.     // Перегружаем операторы основных операций
  78.     Variable operator+(const Variable &variable) const {
  79.         return Variable(toInt() + variable.toInt());
  80.     }
  81.  
  82.     Variable operator-(const Variable &variable) const {
  83.         return Variable(toInt() - variable.toInt());
  84.     }
  85.  
  86.     Variable operator*(const Variable &variable) const {
  87.         vector<int> dividers = variable.getDividers();
  88.         // Добавляем множители из текущей переменной
  89.         dividers.insert(dividers.end(), _dividers.begin(), _dividers.end());
  90.        
  91.         int sign = _sign * variable.getSign();
  92.  
  93.         Variable newVar(dividers, sign);
  94.         return newVar;
  95.     }
  96.  
  97.     Variable operator/(const Variable &variable) const {
  98.         return Variable(toInt() / variable.toInt());
  99.     }
  100. };
  101.  
  102. // Перегружаем оператор вывода
  103. ostream& operator << (ostream& ostream, const Variable &variable) {
  104.     ostream << variable.toInt();
  105.     return ostream;
  106. }
  107.  
  108.  
  109.  
  110.  
  111. /**
  112.  * Пример Main.cpp
  113.  */
  114. #include <iostream>
  115. #include "Variable.hpp"
  116.  
  117. int main() {
  118.     Variable first(12);
  119.     Variable second(4);
  120.  
  121.     Variable result = first / second;
  122.  
  123.     std::cout << result << std::endl;
  124.     system("pause");
  125.  
  126.     return 0;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement