def decreaseNumbers(self, nr1, nr2, base): ''' decreases two numbers in a given base in: ->nr1:string number ->nr2:string number ->base:int number ''' need = Number("", 10) a1 = need.digits(nr1) a2 = need.digits(nr2) t = 0 res = "" while a1 != [] and a2 != []: dif = need.stringToInt(a1[-1]) - need.stringToInt(a2[-1]) - t dif, t = self.verifDigit(dif, base) res += self.intToString(dif) a1 = a1[:-1] a2 = a2[:-1] while a1 != []: dif = need.stringToInt(a1[-1]) - t dif, t = self.verifDigit(dif, base) res += self.intToString(dif) a1 = a1[:-1] while len(res) != 1 and res[-1] == '0': res = res[:-1] res = Number(res[::-1], base) return res
def addNumbers(self, nr1, nr2, base): ''' add two numbers with a given base in: ->nr1:a string number ->nr2:a string number ->base a int number out:a number type ''' need = Number("", 10) a1 = need.digits(nr1) a2 = need.digits(nr2) t = 0 res = "" while a1 != [] and a2 != []: s = need.stringToInt(a1[-1]) + need.stringToInt(a2[-1]) + t s, t = self.verifDigit(s, base) res += self.intToString(s) a1 = a1[:-1] a2 = a2[:-1] while a1 != []: s = need.stringToInt(a1[-1]) + t s, t = self.verifDigit(s, base) res += self.intToString(s) a1 = a1[:-1] while a2 != []: s = need.stringToInt(a2[-1]) + t s, t = self.verifDigit(s, base) res += self.intToString(s) a2 = a2[:-1] if t != 0: res += self.intToString(t) res = Number(res[::-1], base) return res
def divD(self, nr, digit, base): ''' multiply a number with a digit in a given base in: ->nr:string number ->digit:a char ->base:int number out:the result (a number type) and the rest a char ''' need = Number("", 10) res = "" a = need.digits(nr) a = a[::-1] d = need.stringToInt(digit) q = need.stringToInt(a[-1]) // d r = need.stringToInt(a[-1]) % d res += self.intToString(q) a = a[:-1] while a != []: r = r * base r += need.stringToInt(a[-1]) q = r // d res += self.intToString(q) r = r % d a = a[:-1] res = res[::-1] while len(res) != 0 and res[-1] == '0': res = res[:-1] res = Number(res[::-1], base) return res, self.intToString(r)
def substitution(self, nr, base): ''' the substitution method in: ->nr: number type ->base:an integer number out: the result (a number type) ''' res = Number("0", base) need = Number("", base) a1 = [] if need.stringToInt(nr.get_number()) < base: #if the number is smaller than the base then it is a digit for this base res.set_number( self.op.intToString(need.stringToInt(nr.get_number()))) else: a1 = need.digits(nr.get_number()) p = 0 need = Number("", 10) while a1 != []: copy = p strBase = self.op.intToString(nr.get_base()) power = '1' while copy != 0: power = self.op.mulNumbers(power, strBase, base).get_number() copy -= 1 digit = a1[-1] product = self.op.mulNumbers(power, digit, base) p += 1 res.set_number( self.op.addNumbers(res.get_number(), product.get_number(), base).get_number()) a1 = a1[:-1] return res
def validateDigitB(self, digit, base): ''' validates a digit to be the digit of a specified base digit,base string numbers ''' errors = [] need = Number("", 10) if need.stringToInt(digit) > need.stringToInt(base): errors.append( "Invalid number!The digits must be between 0 and base-1!\n") if digit < '0': errors.append("The digit can't be negative!\n") if len(errors): raise validationExceptions(errors)
def decrTwoNr(self, nr1, nr2): ''' decreases two numbers in one of number's base as the user like in: ->nr1,nr2 :number type out: the sum : a number type ''' need = Number("", 10) print("The base can be " + self.__controller.nrIntToString(nr1.get_base()) + " or " + self.__controller.nrIntToString(nr2.get_base()) + "!") base = input("Give the base,on which the operations will be done:\n") try: self.__nrValid.validateBaseInput(need.stringToInt(base), nr1, nr2) base = int(base) if base == nr1.get_base(): nr2.set_number( self.__controller.convertNr(nr2, nr1.get_base()).get_number()) nr2.set_base(base) elif base == nr2.get_base(): nr1.set_number( self.__controller.convertNr(nr1, nr2.get_base()).get_number()) nr1.set_base(base) self.__nrValid.decreasesValidation(nr1.get_number(), nr2.get_number()) return self.__controller.decreaseNumbers(nr1, nr2, base) except commandValidationExceptions as ex: print(ex)
def testNumber(): nr=Number("100",2) assert nr.get_number()=="100" assert nr.get_base()==2 nr.set_number("12") assert nr.get_number()=="12" nr.set_base(10) assert nr.get_base()==10 nr2=Number("12",10) assert nr==nr2 array=nr.digits(nr.get_number()) assert array==["1","2"] char='A' assert nr.modifyChar(char)==10 assert nr.stringToInt(char)==10 char="1" assert nr.stringToInt(char)==1
def mulNumbers(self, nr, digit, base): ''' multiply a number with a digit in a given base in: ->nr:string number ->digit:a char ->base:int number out: a number type ''' need = Number("", 10) d = need.stringToInt(digit) a = need.digits(nr) t = 0 res = "" while a != []: product = need.stringToInt(a[-1]) * d + t product, t = self.verifDigit(product, base) res += self.intToString(product) a = a[:-1] if t != 0: res += self.intToString(t) res = Number(res[::-1], base) return res
def validateDigit(self, digit): ''' validates a digit without taking into account the base ''' errors = [] need = Number("", 10) if need.stringToInt(digit) > 16: errors.append("Invalid digit!The digit must be smaller than 10!\n") if digit < '0': errors.append("The digits of number can't be negative!\n") if not ((ord(digit) <= 57 and ord(digit) >= 48) or (ord(digit) <= 70 and ord(digit) >= 65) or (ord(digit) <= 102 and ord(digit) >= 97)): errors.append("Invalid digit!") if len(errors): raise validationExceptions(errors)