88 lines
2.0 KiB
Python

dictionary = [chr(i) for i in range(ord('0'), ord('9')+1)] + \
[chr(i) for i in range(ord('A'), ord('F')+1)]
def validation(string, ibase, tbase):
for n in string:
if not n in dictionary[:ibase] + [',', '.']:
return False
if ibase < 2 or ibase > 16 or tbase < 2 or tbase > 16:
return False
return True
def convert(string, ibase, tbase):
if string == '0':
return 0
if ibase != 10:
string = other_to_dec(string, ibase)
if tbase == 10:
return string
string = float(string)
integer = dec_to_other(int(string), tbase)
decimal = string - int(string)
if decimal:
decimal = float_dec_with__to_other(decimal, tbase)
return integer + ',' + decimal
return integer
def other_to_dec(string, ibase):
sum = 0
amount = len(string.split('.')[0])-1
for n in string:
if n != '.':
sum += int(dictionary.index(n)) * ibase**amount
amount -= 1
return sum
def dec_to_other(num, tbase):
result = ''
while num // tbase > 0:
result += str(dictionary[int(num % tbase)])
num //= tbase
result += str(dictionary[int(num % tbase)])
return result[::-1]
def float_dec_with__to_other(num, tbase):
result = ''
counter = 0
while num - int(num) > 0 and counter < 8:
result += str(dictionary[int(num * tbase)])
num = num * tbase - int(num * tbase)
counter += 1
return result[:7]
# _____ MAIN PROGRAMM _____
input_number = input("Число: ").upper().replace(",", ".")
init_base = int(input("Основание исходной системы: "))
target_base = int(input("Основание конечной системы: "))
hasSign = False
if input_number[0] == '-':
hasSign = True
input_number = input_number[1:]
if not validation(input_number, init_base, target_base):
print("Wrong input!")
exit()
output = convert(input_number, init_base, target_base)
if hasSign:
output = '-' + str(output)
print(output)