Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
 Аватар для Singleton
179 / 74 / 8
Регистрация: 27.12.2012
Сообщений: 432

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

18.07.2018, 13:17. Показов 6417. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.07.2018, 13:17
Ответы с готовыми решениями:

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

Класс с системами исчисления
Создайте класс для числа. В классе должна быть реализована следующая функциональность: ■ Запись и чтение значения. ■ Перевод числа в...

Перевод записи числа между двумя произвольными системами счисления
Надо перевести число из одной системы счисления в другую. У меня получилось так: n = int(input()) a = input() k = int(input()) if a...

2
 Аватар для Singleton
179 / 74 / 8
Регистрация: 27.12.2012
Сообщений: 432
21.07.2018, 12:07  [ТС]
* Проблему с нулями решил избавившись от извращений:
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
3 / 2 / 1
Регистрация: 19.03.2016
Сообщений: 18
26.07.2018, 18:10
Если честно, не особо вникал в предыдущие сообщения, но вот код, который удовлетворяет задаче:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.07.2018, 18:10
Помогаю со студенческими работами здесь

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

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

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

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

Перевод между системами счисления
Напишите программу, которая запрашивает ввод числа в шестнадцатеричном виде и выводит его в восьмеричной и десятичной системах счисления


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru