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)
Exemple #6
0
 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)