Abhisek92

Untitled

Jan 17th, 2018
291
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.48 KB | None | 0 0
  1. class ArgumentTypeError(Exception):
  2.     def __init__(self, value):
  3.         self.value = value
  4.     def __str__(self):
  5.         return(repr(self.value))
  6.  
  7.  
  8. def gcd(a, b):
  9.     try:
  10.         if isinstance(a, int) and isinstance(b, int):
  11.             if b > a:
  12.                 a, b = b, a
  13.             if b == 0:
  14.                 raise ValueError("Illegal value Zero(0): Expected non zero integers")
  15.             else:
  16.                 if a % b == 0:
  17.                     return b
  18.                 else:
  19.                     return gcd((a % b), b)
  20.         else:
  21.             raise ArgumentTypeError("Invalid Argument Type: Expected <int int>")
  22.     except ArgumentTypeError as arg_exception:
  23.         print str(arg_exception)
  24.         return None
  25.     except ValueError as val_exception:
  26.         print str(val_exception)
  27.         return None
  28.  
  29.  
  30. def lcm(a, b):
  31.     try:
  32.         if isinstance(a, int) and isinstance(b, int):
  33.             if gcd(a, b) == 1:
  34.                 return a*b
  35.             else:
  36.                 return (a * b) / gcd(a, b)
  37.         else:
  38.             raise ArgumentTypeError("Invalid Argument Type: Expected <int int>")
  39.     except ArgumentTypeError as arg_exception:
  40.         print str(arg_exception)
  41.         return None
  42.     except ValueError as val_exception:
  43.         print str(val_exception)
  44.         return None
  45.  
  46.  
  47. class Fraction:
  48.     __sign = None
  49.     __numerator = None
  50.     __denominator = None
  51.  
  52.     def get_numerator(self):
  53.         return self.__numerator
  54.  
  55.  
  56.     def get_denominator(self):
  57.         return self.__denominator
  58.  
  59.  
  60.     def get_sign(self):
  61.         return self.__sign
  62.  
  63.  
  64.     def __init__(self, a, b):
  65.         try:
  66.             if (isinstance(a, int) or isinstance(a, float) or isinstance(a, Fraction)) and (isinstance(b, int) or isinstance(b, float) or isinstance(b, Fraction)):
  67.                if isinstance(b, int) and b == 0:
  68.                    raise ValueError("Illegal value Zero(0): Expected non zero integers")
  69.                if (isinstance(a, float) or isinstance(b, float)) or (isinstance(a, Fraction) or isinstance(b, Fraction)) :
  70.                    if isinstance(a, float):
  71.                        frac = a.as_integer_ratio()
  72.                        a = Fraction(frac[0], frac[1])
  73.                    if isinstance(b, float):
  74.                        frac = b.as_integer_ratio()
  75.                        b = Fraction(frac[0], frac[1])
  76.                    c = a.__div__(b)
  77.                    self.__numerator = c.get_numerator()
  78.                    self.__denominator = c.get_denominator()
  79.                else:
  80.                    self.__numerator = abs(a)
  81.                    self.__denominator = abs(b)
  82.                if a*b < 0:
  83.                    self.__sign = -1
  84.                else:
  85.                    self.__sign = 1
  86.             else:
  87.                 raise ArgumentTypeError("Invalid Argument Type: Expected <int/Fraction, int/Fraction>")
  88.         except ArgumentTypeError as arg_exception:
  89.             print str(arg_exception)
  90.         except ValueError as val_exception:
  91.             print str(val_exception)
  92.  
  93.  
  94.     def __str__(self):
  95.         if (self.__sign is not None) and (self.__numerator is not None) and (self.__denominator is not None):
  96.             if self.get_denominator() == 1:
  97.                 return str(self.__sign * self.__numerator)
  98.             else:
  99.                 return str(self.__sign * self.__numerator) + "/" + str(self.__denominator)
  100.         else:
  101.             return None
  102.  
  103.  
  104.     def inverse(self):
  105.         a = self.__denominator
  106.         b = self.__numerator
  107.         c = Fraction(a, b)
  108.         return c.simplify()
  109.  
  110.  
  111.     def simplify(self):
  112.         factor = gcd(self.__numerator, self.__denominator)
  113.         if factor is not None:
  114.             a = self.__numerator / factor
  115.             b = self.__denominator / factor
  116.             return Fraction((self.__sign * a), b)
  117.         else:
  118.             return None
  119.  
  120.  
  121.     def __add__(self, fraction):
  122.         try:
  123.             if isinstance(fraction, Fraction) or isinstance(fraction, int) or isinstance(fraction, float):
  124.                 if isinstance(fraction, int):
  125.                     fraction = Fraction(fraction, 1)
  126.                 if isinstance(fraction, float):
  127.                     frac = a.as_integer_ratio()
  128.                     fraction = Fraction(frac[0], frac[1])
  129.                 b = self.__denominator * fraction.get_denominator()
  130.                 a = (self.__sign * (b / self.__denominator) * self.__numerator) + (self.__sign * (b / fraction.get_denominator()) * fraction.get_numerator())
  131.                 return Fraction(a, b).simplify()
  132.             else:
  133.                 raise ArgumentTypeError("Invalid Argument Type: Expected <int/Fraction>")
  134.         except ArgumentTypeError as arg_exception:
  135.             print str(arg_exception)
  136.  
  137.  
  138.     def __sub__(self, fraction):
  139.         try:
  140.             if isinstance(fraction, Fraction) or isinstance(fraction, int) or isinstance(fraction, float):
  141.                 if isinstance(fraction, int):
  142.                     fraction = Fraction(fraction, 1)
  143.                 if isinstance(fraction, float):
  144.                     frac = a.as_integer_ratio()
  145.                     fraction = Fraction(frac[0], frac[1])
  146.                 b = self.get_denominator() * fraction.get_denominator()
  147.                 a = (self.get_sign() * (b / self.get_denominator()) * self.get_numerator()) - (self.get_sign() * (b / fraction.get_denominator()) * fraction.get_numerator())
  148.                 return Fraction(a, b).simplify()
  149.             else:
  150.                 raise ArgumentTypeError("Invalid Argument Type: Expected <int/Fraction>")
  151.         except ArgumentTypeError as arg_exception:
  152.             print str(arg_exception)
  153.  
  154.  
  155.     def __mul__(self, fraction):
  156.         try:
  157.             if isinstance(fraction, Fraction) or isinstance(fraction, int) or isinstance(fraction, float):
  158.                 if isinstance(fraction, int):
  159.                     fraction = Fraction(fraction, 1)
  160.                 if isinstance(fraction, float):
  161.                     frac = a.as_integer_ratio()
  162.                     fraction = Fraction(frac[0], frac[1])
  163.                 a = self.__numerator * fraction.__numerator
  164.                 b = self.__denominator * fraction.__denominator
  165.                 return Fraction(a, b).simplify()
  166.             else:
  167.                 raise ArgumentTypeError("Invalid Argument Type: Expected <int/Fraction>")
  168.         except ArgumentTypeError as arg_exception:
  169.             print str(arg_exception)
  170.  
  171.  
  172.     def __div__(self, fraction):
  173.         try:
  174.             if isinstance(fraction, Fraction) or isinstance(fraction, int) or isinstance(fraction, float):
  175.                 if isinstance(fraction, int):
  176.                     if fraction == 0:
  177.                         raise ValueError("Illegal value Zero(0): Expected non zero integers")
  178.                     else:
  179.                         fraction = Fraction(fraction, 1)
  180.                 if isinstance(fraction, float):
  181.                     if fraction == 0.0:
  182.                         raise ValueError("Illegal value Zero(0): Expected non zero integers")
  183.                     else:
  184.                         frac = a.as_integer_ratio()
  185.                         fraction = Fraction(frac[0], frac[1])
  186.                 return (self.__mul__(fraction.inverse())).simplify()
  187.             else:
  188.                 raise ArgumentTypeError("Invalid Argument Type: Expected <int/Fraction>")
  189.         except ArgumentTypeError as arg_exception:
  190.             print str(arg_exception)
  191.         except ValueError as val_exception:
  192.             print str(val_exception)
Add Comment
Please, Sign In to add comment