Как создать функцию, имитирующую метод длинного деления преобразования десятичной дроби в другую базу
Запуск программы должен предложить пользователю ввести число, основание числа и основание для преобразования в число, а затем распечатать результаты преобразования числа в десятичное число, а затем десятичное число в выходное основание. Вот пример вывода, если число, подлежащее преобразованию, является шестнадцатеричным 23B4 в восьмеричное:
Enter a number: 23b4 Enter base from: 16 Enter base to convert to: 8 4 x 16 ^ 0 = 4 x 1 = 4 B x 16 ^ 1 = 11 x 16 = 176 3 x 16 ^ 2 = 3 x 256 = 768 2 x 16 ^ 3 = 2 x 4096 = 8192 23b4 base 16 is decimal 9140 9140 / 8 = 1142 , 4 1142 / 8 = 142 , 6 142 / 8 = 17 , 6 17 / 8 = 2 , 1 2 / 8 = 0 , 2 decimal 9140 is 21664 in base 8 So a general process flow is: • Ask for number to convert • Ask for base of number • Ask for base to convert to • Set decimal to return of "toDecimal" passing the number-in and base-in • Print message number-in base base-in is decimal decimal-value • Set number-out to return of "fromDecimal" passing decimal and base-out • Print message decimal is number-out in base base-out Outline of the fromDecimal function: • Define a string number-out and initialize it to an empty string, i.e. ‘’ or "" (this will allow us to concatenate digits to it in a loop) • Set a quotient variable to the decimal passed in • Create while loop that checks for quotient great than zero • Set a remainder variable to quotient mod base-out • Set next-digit to return of valueToDigit passing in the remainder • Set a new-quotient variable to quotient integer-division base-out • Print this loop as: quotient / base-out = new-quotient , next-digit • Append next digit to front of number-out (e.g. sNumberOut = nextDigit + sNumberOut) • Set quotient to new-quotient • (Loop will continue till quotient is zero) • Return number-out
Что я уже пробовал:
def digitToValue(digit, base): value = 0 if digit >= '0' and digit <= '9': value = int(digit) elif digit >= 'A' and digit <= 'F': if digit == 'A': value = 10 elif digit == 'B': value = 11 elif digit == 'C': value = 12 elif digit == 'D': value = 13 elif digit == 'E': value = 14 else: value = 15 else: print("Invalid digit!") return -1 if value < 0 or value >= base: print("Invalid digit for base!") return -1 return value def toDecimal (sNumber, nBase): decimal = 0 for i in range(len(sNumber)): digitPos = len(sNumber) - 1 - i digit = sNumber[digitPos] digitVal = digitToValue(digit, nBase) if (digitVal == -1): return -1 posVal = nBase ** i product = digitVal * posVal print(digit, "x", nBase, "^", i, "=", digitVal, "x", posVal, "=", product) decimal += product return decimal numberIn = input("Enter a number: ") baseIn = input("Enter base from: ") convertTo = input("Enter base to convert to: ") decimalOut = toDecimal(numberIn, baseIn) print(decimalOut)
PIEBALDconsult
Симулировать?