Member 13684472 Ответов: 2

Как создать функцию, имитирующую метод длинного деления преобразования десятичной дроби в другую базу


Запуск программы должен предложить пользователю ввести число, основание числа и основание для преобразования в число, а затем распечатать результаты преобразования числа в десятичное число, а затем десятичное число в выходное основание. Вот пример вывода, если число, подлежащее преобразованию, является шестнадцатеричным 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

Симулировать?

2 Ответов

Рейтинг:
0

CPallini

Следующий код исправляет ошибки, которые есть у вашего устройства. Теперь вы должны завершить его.

#  ...
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 #  your return statement had wrong indentation



numberIn = input("Enter a number: ")
baseIn = input("Enter base from: ")
convertTo = input("Enter base to convert to: ")
decimalOut = toDecimal(str(numberIn), baseIn) # added the call to str function
print(decimalOut)


Рейтинг:
0

Member 13684472

def toDecimal (sNumber, nBase):
десятичная дробь = 0

для i в диапазоне(len(sNumber)):

digitPos = len(sNumber) - 1 - i

digit = sNumber[digitPos]

digitVal = digitToValue(цифра, nBase)

если (digitVal == -1):
возврат -1

posVal = nBase ** i

продукт = digitVal * posVal

печать(цифровая, "х", nBase, "^", я, "=", digitVal, "х", posVal, "=", продукт)

десятичное число += произведение

возврат десятичной дроби



numberIn = input("введите число: ")
baseIn = int(input("Enter base from: "))
convertTo = int(input("введите базу для преобразования в: "))
decimalOut = toDecimal(numberIn, baseIn)
печати(номера, "основание" , значение, " десятичных ", decimalOut)
fromDecimal = " "
numberOut = fromDecimal(десятичный, базовый)
печати("десятичное число ", десятичных, "является" , numberOut , " в базе ", baseOut)


Patrice T

Это ваше решение или новый код с новыми проблемами?

Member 13684472

я просто не знаю, как получить его, как это:
Введите номер: 23b4
Введите базу с: 16
Введите базу для преобразования в: 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 основание 16 десятичное 9140

9140 / 8 = 1142 , 4
1142 / 8 = 142 , 6
142 / 8 = 17 , 6
17 / 8 = 2 , 1
2 / 8 = 0 , 2
десятичное число 9140 равно 21664 в базе 8

потому что когда я его запускаю он выглядит так:
Введите номер: 23b4
Введите базу с: 16
Введите базу для преобразования в: 8
4 x 16 ^ 0 = 4 x 1 = 4
Неверная цифра!
База 23b4 16 является десятичным числом -1

Member 13686192

Эй, я тоже застрял на части с дивизией. Вы можете показать мне, как это делается?