Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python для начинающих
Войти
Регистрация
Восстановить пароль
 
Singleton
176 / 71 / 8
Регистрация: 27.12.2012
Сообщений: 386
1

Перевод между произвольными системами исчисления (n = 1.36)

18.07.2018, 13:17. Просмотров 163. Ответов 2

Условие задачи:
Кликните здесь для просмотра всего текста
Разработать функцию convert_n_to_m (x, n, m),
которая принимает 3 аргумента - целое число (в системе счисления с основанием n) или строку x, представляющий такое число, и целые числа n и m (1 <= n, m <= 36),
и возвращает строку - представление числа х в системе счисления m.

В случае, если аргумент х не является числом или строкой, или не может быть представлением целого неотрицательного числа в системе счисления с основанием n, вернуть логическую константу False.

В системах счисления с основанием больше десяти для обозначения разрядов со значением более 9 использовать буквы латинского алфавита в верхнем регистре от A до Z. Во входном x могут использоваться оба регистра.

Считать, что в единичной системе счисления число записывается соответствующим количеством нулей.

К примеру
Вызов функции: convert_n_to_m ([123], 4, 3)
Возвращает: False
Вызов функции: convert_n_to_m ( "0123", 5, 6)
Возвращает: 102
Вызов функции: convert_n_to_m ( "123", 3, 5)
Возвращает: False
Вызов функции: convert_n_to_m (123, 4, 1)
Возвращает: +000000000000000000000000000
Вызов функции: convert_n_to_m (-123.0, 11, 16)
Возвращает: False
Вызов функции: convert_n_to_m ( "A1Z", 36, 16)
Возвращает: 32E7

В конце кода привожу проверочные вызовы функции, корректные данные получаю во всех случаях кроме трех:
* аргументом передана последовательность нулей, на выходе получаю False вместо 0
Пробовал в разных местах кода проверку, но не помогает:
Python
1
2
if set(str(x)) == {'0'}:
        return '0'
* аргументом передано длинное целое, у меня в коде проверки на соответствие типа int, плюс python 3 (https://www.jdoodle.com/python3-programming-online) не понимает запись вида 777L и тип long вообще, а целевая версия python 2.7
* почему-то вызов convert_n_to_m ( 'qweasd', 33, 36) вместо HGPEYJ возвращает 71GPEYJ
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 
def convert_n_to_m (x, n, m):
# X число
# N основа родной СЧ
# M основа новой СЧ
    if isinstance (x, str):
        x = x.upper ()
    if not isCorrectValue (x, n):
        return False
    if m == 1:
        return '0' * (to10 (x, n))
    if n == m:
        return x
    if isinstance (x, int) and set (str (x)) == { '0'}:
        return '0'
    return from10 (to10 (x, n), m)
 
def isCorrectValue (x, n):
    if x in [True, False]:
        return False
    
    if not (isinstance (x, int) or isinstance (x, str)):
        return False
        
    if (isinstance (x, int) and (x> = 0)):
        return True
    elif (isinstance (x, int) and (x <0)):
        return False
    
    for i in set (x):
        if not (i in alphabet):
            return False
        else:
            if alphabet.find (i)> = n:
                return False
    return True
 
def get10val (symb):
    return alphabet.find (symb.upper ())
    
def to10 (x, n):
    if n == 10:
        result = str (x)
    else:
        tmp = str (x)
        result = 0
        for i in range (len (tmp)):
            result + = get10val (tmp [i]) * (n ** (len (tmp) - 1 - i))
    return int (result)
    
def from10 (x, m):
    result = ""
    while x> = m:
        result + = alphabet [x% m]
        x = x // m
    result + = str (x)
    return result.upper () [:: - 1]
 
print (convert_n_to_m ( 'qweasd', 33, 36))
# Ожидаемый результат: HGPEYJ
 
print (convert_n_to_m (0, 10, 2))
# Ожидаемый результат: 0
 
print (convert_n_to_m (000, 10, 2))
# Ожидаемый результат: 0
 
#print (convert_n_to_m (777, 10, 2))
# Ожидаемый результат: 1100001001
 
print (convert_n_to_m (777L, 10, 2))
# Ожидаемый результат: 1100001001
 
#print (convert_n_to_m ( '000', 10, 2))
# Ожидаемый результат: 0
 
#print (convert_n_to_m (+123123123123123123123, 11, 16))
# Ожидаемый результат: 2C09BC518E8048D23A
 
#print (convert_n_to_m (+123123123123123123123, 10, 10))
# Ожидаемый результат: 123123123123123123123
 
#print (convert_n_to_m (True, 1, 2))
# Ожидаемый результат: False
 
#print (convert_n_to_m ( 'bnh34521 ", 31, 14))
# Ожидаемый результат: 119337DC2BC
#print (convert_n_to_m ([123], 4, 3))
#print (convert_n_to_m ( "0123", 5, 6))
#print (convert_n_to_m ( "123", 3, 5))
#print (convert_n_to_m (33, 4, 1))
#print (convert_n_to_m (-123.0, 11, 16))
#print (convert_n_to_m ( "A1Z", 36, 16))
#print (convert_n_to_m ( "10010111", 2, 16))
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2018, 13:17
Ответы с готовыми решениями:

Напишите программу, переводящую запись числа между двумя произвольными системами счисления
На вход программа получает три величины: n, A, k, где n и k – натуральные числа...

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

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

Перевод между системами счисления
Написать функцию num2dig(n), преобразующую целое число n от 0 до 35 в...

Перевод между Системами счисления
Входящие даные: Любое десятичное число(положительное); Основа системы счисления...

2
Singleton
176 / 71 / 8
Регистрация: 27.12.2012
Сообщений: 386
21.07.2018, 12:07  [ТС] 2
* Проблему с нулями решил избавившись от извращений:
Python
1
2
    if isinstance(x, int) and (x == 0):
        return 0
* С типом long по непонятной мне причине интерпретатор заработал, больше проверок на long не вносил:
Python
1
2
if not (isinstance(x, int) or isinstance(x, str) or isinstance(x, long)):
    return False
* convert_n_to_m ( 'qweasd', 33, 36) вместо HGPEYJ возвращает 71GPEYJ, т.к. остаток от деления = 17 ("Н"), исправил выбором из алфавита по индексу:
Python
1
2
    result += str(alphabet[x])
    return result.upper()[::-1]
По непонятной мне причине образовался следующий глюк: вызов convert_n_to_m(123123123123123123123, 11, 16) возвращает 2C09BC518E8048D23A (правильно), а сразу за ним идет convert_n_to_m(123123123123123123123, 10, 10), который снова возвращает 2C09BC518E8048D23A вместо 123123123123123123123
Кот целиком:
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 
def convert_n_to_m(x, n, m):
# x число
# n основа родной СЧ
# m основа новой СЧ
    if isinstance(x, str):
        x = x.upper()
    if isinstance(x, int) and (x == 0):
        return 0
    
    if not isCorrectValue(x, n):
        return False
    if m == 1:
        return '0'*(to10(x, n))
    if n == m:
        return x
    return from10(to10(x, n), m)
 
def isCorrectValue(x, n):
    if x in [True, False]:
        return False
 
    if not (isinstance(x, int) or isinstance(x, str) or isinstance(x, long)):
        return False
        
    if (isinstance(x, int) and (x >= 0)):
        return True
    elif (isinstance(x, int) and (x < 0)):
        return False
    
    for i in set(x):
        if not (i in alphabet):
            return False
        else:
            if alphabet.find(i) >= n:
                return False
    return True
 
def get10val(symb):
    return alphabet.find(symb.upper())
    
def to10(x, n):
    if n == 10:
        result = str(x)
    else:
        tmp = str(x)
        result = 0
        for i in range(len(tmp)):
            result += get10val(tmp[i])*(n**(len(tmp) - 1 - i))
    return int(result)
    
def from10(x, m):
    result = ""
    while x >= m:
        result += alphabet[x % m]
        x = x // m
    result += str(alphabet[x])
    return result.upper()[::-1]
 
print (convert_n_to_m ( 'qweasd', 33, 36))
# Ожидаемый результат: HGPEYJ
 
print (convert_n_to_m (0, 10, 2))
# Ожидаемый результат: 0
 
print (convert_n_to_m (000, 10, 2))
# Ожидаемый результат: 0
 
print (convert_n_to_m (777, 10, 2))
# Ожидаемый результат: 1100001001
 
print (convert_n_to_m (777L, 10, 2))
# Ожидаемый результат: 1100001001
 
print (convert_n_to_m ( '000', 10, 2))
# Ожидаемый результат: 0
 
print (convert_n_to_m (+123123123123123123123, 11, 16))
# Ожидаемый результат: 2C09BC518E8048D23A
 
print (convert_n_to_m (+123123123123123123123, 10, 10))
# Ожидаемый результат: 123123123123123123123
 
print (convert_n_to_m (True, 1, 2))
# Ожидаемый результат: False
 
print (convert_n_to_m ( 'bnh34521 ", 31, 14))
# Ожидаемый результат: 119337DC2BC
 
#print (convert_n_to_m ([123], 4, 3))
#print (convert_n_to_m ( "0123", 5, 6))
#print (convert_n_to_m ( "123", 3, 5))
#print (convert_n_to_m (33, 4, 1))
#print (convert_n_to_m (-123.0, 11, 16))
#print (convert_n_to_m ( "A1Z", 36, 16))
#print (convert_n_to_m ( "10010111", 2, 16))
0
mr Slipknot
1 / 1 / 0
Регистрация: 19.03.2016
Сообщений: 16
26.07.2018, 18:10 3
Если честно, не особо вникал в предыдущие сообщения, но вот код, который удовлетворяет задаче:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def to_scale_notation(n, to_base=3, from_base=10):
    alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    if not 1 <= to_base <= 36:
        return False
    if not 1 <= from_base <= 36:
        return False
        
    try:
        if from_base == 1:
            n = len(n)
        else:
            n = int(str(n), from_base)
    except Exception as e:
        return False
 
    if to_base == 1:
        return '0' * n
        
    if n < to_base:
        return alphabet[n]
    else:
        return to_scale_notation(n // to_base, to_base) + alphabet[n % to_base]
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2018, 18:10

Перевод между системами счисления
Есть ли в adnroid встроенная функция перевода из одной системы счисления в...

Перевод чисел между системами счисления в Делфи
Помогите написать программу которая переводит вещественные числа из десятичной...

Перевод чисел между различными системами счисления
о Делфи: нужно создать кнопки: для перевода чисел из восьмеричной системы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru