#include "product.h" void Product::Divide_Binom(int n, int k){ int f[n], g[k]; int diff; if (n > k) diff = n - k; else if (n < k) diff = k - n - 1; for (int i = n; i > diff; i--){ f[i]=i; denominator.insert(f[i]); } for (int j = k; j > 1 ; j--){ g[j]=j; numerator.insert(g[j]); } } void Product::Multiply_Binom(int n, int k){ int f[n], g[k]; int diff; if (n > k) diff = n - k; else if (n < k) diff = k - n - 1; //else if (n = k) diff for (int i = n; i > diff; i--){ f[i]=i; numerator.insert(f[i]); } for (int j = k; j > 1 ; j--){ g[j]=j; denominator.insert(g[j]); } } void Product::Multiply_Exponential(int n) { multiset ::iterator vit; int fact[n]; for ( int i = n ; i > 1; i--){ fact[i]= i; numerator.insert(fact[i]); } } void Product::Divide_Exponential(int n){ multiset ::iterator rit; int fact[n]; for (int i = n; i > 1; i--){ fact[i]=i; denominator.insert(fact[i]); } } void Product::Multiply_Number(double n){ multiset ::iterator vit; numerator.insert(n); } void Product::Divide_Number(double n){ multiset ::iterator rit; denominator.insert(n); } double Product::Calculate_Product(){ multiset ::iterator vit; multiset ::iterator rit; double x, total, top, bot; int t, n, d; n = numerator.size(); d = denominator.size(); if ( n == 0 && d == 0 ){ total = 1; } if ( n > 0 && d == 0 ){ total = accumulate (numerator.begin(), numerator.end(),1.0,multiplies()); } if ( n == 0 && d > 1 ){ total = accumulate (denominator.begin(), denominator.end(), 1.0, multiplies()); total = 1 / total; } if ( d > n ) t = d; if ( d < n ) t = n; if ( d == n) t = d; std::vector vec(t); if ( n > 0 && d > 1){ top = accumulate (numerator.begin(), numerator.end(), 1.0, multiplies()); bot = accumulate (denominator.begin(), denominator.end(), 1.0, multiplies()); total = top/bot; } if ( n > 1 && d == 1 ){ for (vit = denominator.begin(); vit != denominator.end(); vit++){ x = *vit; } total = accumulate (numerator.begin(), numerator.end(), 1.0, multiplies()); total = total / x; } if ( n == 1 && d > 1 ){ for (rit = numerator.begin(); rit != numerator.end(); rit++){ x = *rit; } total = accumulate (denominator.begin(), denominator.end(), 1.0, multiplies()); total = x / total; } rit = numerator.begin(); vit = denominator.begin(); if ( d == 1 && n == 0){ total = 1 / *vit; } else if ( d == 0 && n == 1){ total = *rit / 1; } else if ( d == 1 && n == 1){ total = *rit / *vit; } return total; } void Product::Print(){ multiset ::iterator vit; multiset ::iterator rit; double n, m, denom, num; n = numerator.size(); m = denominator.size(); rit = numerator.begin(); vit = denominator.begin(); if ( n > 1 && m == 1 ){ vit = numerator.find(*rit); numerator.erase(vit); cout << *rit << " / 1\n"; exit(1); } if ( n == 0 ){ cout << "1"; } for (vit = numerator.begin(); vit != numerator.end(); vit++){ if ( n == 1){ cout << *vit; } if ( n > 1 ) { if ( vit != numerator.begin()){ cout << " * "; } cout << *vit; num = *vit; } } cout << " / "; if (m == 0){ cout << "1"; } for (rit = denominator.begin(); rit != denominator.end(); rit++){ denom = *rit; if ( m == 1){ cout << *rit; } if ( m > 1 ){ if (rit != denominator.begin()){ cout << " / "; } cout << *rit; } } cout <<"\n"; } void Product::Clear(){ numerator.clear(); denominator.clear(); } void Product::Invert(){ numerator.swap(denominator); }