From a6f3ace74e261f26b99b7b67a9da10a55b0845fd Mon Sep 17 00:00:00 2001 From: chabisik Date: Sat, 26 Mar 2022 17:05:01 +0100 Subject: [PATCH] Adding good multiplication function --- CTPLICA/comproject.py | 77 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 3 deletions(-) diff --git a/CTPLICA/comproject.py b/CTPLICA/comproject.py index 8252349..d641c34 100644 --- a/CTPLICA/comproject.py +++ b/CTPLICA/comproject.py @@ -1,6 +1,7 @@ #!/usr/bin/python3 import sys +from unittest import result import numpy import time @@ -163,13 +164,83 @@ def greater_than(arg1_integer_part: str, arg2_integer_part: str, arg1_decimal_pa def sb_multiply(arg1: str, arg2: str) -> bool: - pass + # transform arg1 to string if not already in string and test if it's a full integer (without decimal part or decimal part equals zero) + arg1_as_string = str(arg1) + arg1_integer_part = arg1_as_string + arg1_decimal_part = '' + arg1_is_full_integer = True + arg1_is_negative = True if arg1_integer_part.startswith('-') else False + try: + arg1_integer_part, arg1_decimal_part = arg1_as_string.split(".") + if arg1_decimal_part==len(arg1_decimal_part)*'0': arg1_is_full_integer = True + else: arg1_is_full_integer = False + except: + pass#nothing to do + if arg1_is_negative: arg1_integer_part = arg1_integer_part.replace('-', '') + # transform arg2 to string if not already in string and test if it's a full integer (without decimal part or decimal part equals zero) + arg2_as_string = str(arg2) + arg2_integer_part = arg2_as_string + arg2_decimal_part = '' + arg2_is_full_integer = True + arg2_is_negative = True if arg2_integer_part.startswith('-') else False + try: + arg2_integer_part, arg2_decimal_part = arg2_as_string.split(".") + if arg2_decimal_part==len(arg2_decimal_part)*'0': arg2_is_full_integer = True + else: arg2_is_full_integer = False + except: + pass#nothing to do + if arg2_is_negative: arg2_integer_part = arg2_integer_part.replace('-', '') + # making integer and decimal parts same size + max_integer_part_size = max( len(arg1_integer_part), len(arg2_integer_part) ) + arg1_integer_part = '0'*(max_integer_part_size-len(arg1_integer_part)) + arg1_integer_part + arg2_integer_part = '0'*(max_integer_part_size-len(arg2_integer_part)) + arg2_integer_part + #--------- + max_decimal_part_size = max(len(arg1_decimal_part),len(arg2_decimal_part)) + arg1_decimal_part = arg1_decimal_part + '0'*(max_decimal_part_size-len(arg1_decimal_part)) + arg2_decimal_part = arg2_decimal_part + '0'*(max_decimal_part_size-len(arg2_decimal_part)) + # making real multiplication operation + rem = '0' + intermediate_numbers = [] + + #down_number_in_multiplication = arg2_integer_part+arg2_decimal_part + #up_number_in_multiplication = arg1_integer_part+arg1_decimal_part + if arg2_is_full_integer: + down_number_in_multiplication = arg2_integer_part + else: + down_number_in_multiplication = arg2_integer_part+arg2_decimal_part + if arg1_is_full_integer: + up_number_in_multiplication = arg1_integer_part + else: + up_number_in_multiplication = arg1_integer_part+arg1_decimal_part + + print("up_number_in_multiplication", up_number_in_multiplication) + print("down_number_in_multiplication", down_number_in_multiplication) + for j in range(len(down_number_in_multiplication)-1, -1, -1): + current_intermediate_number = '0'*( (len(down_number_in_multiplication)-1) - j ) + for i in range(len(up_number_in_multiplication)-1, -1, -1): + res = int( eval( '((' + down_number_in_multiplication[j] + '*' + up_number_in_multiplication[i] + ')+' + str(rem) + ')%10' ) ) + current_intermediate_number = str(res) + current_intermediate_number + rem = int( eval( '(((' + down_number_in_multiplication[j] + '*' + up_number_in_multiplication[i] + ')+' + str(rem) + ') - ' + str(res) + ')/10') ) + if rem != '0': current_intermediate_number = str(rem) + current_intermediate_number + intermediate_numbers.append(current_intermediate_number) + result = intermediate_numbers[0] + for k in range(1, len(intermediate_numbers)): + result = sb_addition(result, intermediate_numbers[k]) + print("result before putting . :", result) + if not(arg1_is_full_integer) or not(arg2_is_full_integer): + result = result[:-len(arg1_decimal_part+arg2_decimal_part)]+'.'+result[len(result)-len(arg1_decimal_part+arg2_decimal_part):] #here to modifiy + while result.startswith('0'): result = result[1:] + if (arg1_is_negative and not(arg2_is_negative)) or (not(arg1_is_negative) and arg2_is_negative): result = '-' + result + #print("result", result[:-len(arg1_decimal_part+arg2_decimal_part)]+'.'+result[len(result)-len(arg1_decimal_part+arg2_decimal_part):]) + return result if __name__=='__main__': - print("add", sb_addition("-10", "-1.99999993") ) + #print("add", sb_addition("2222222222222222222222222222222222222222.55", "2.55") ) + #print("add", sb_addition("3.8257", "0.8257") ) #print( type(sb_substract("9999999.019999", "99999.99999993")) ) - print("sub", sb_substract("12", "78.9999") ) + #print("sub", sb_substract("12", "78.9999") ) #print(greater_than("0","1110", "0","1112", True, True)) #print(greater_than("0","0", "1110","1112")) #print(greater_than('9001','9003')) + print("mul", sb_multiply('123','123.0')) pass \ No newline at end of file