Python позволяет легко создать целое число из строки заданной базы с помощью
int(str, base).
Я хочу выполнить обратное: создание строки из целого числа , т.е. я хочу некоторую функцию int2base(num, base)
, такую что:
int(int2base(x, b), b) == x
Порядок имени / аргумента функции не имеет значения.
Для любого числа x
и базы, b
которыеint()
которые примут.
Это простая функция для написания: на самом деле это проще, чем описать ее в этом вопросе. Тем не менее, я чувствую, что я должен что-то упустить.
Я знаю , о функциях bin
, oct
, hex
, но я не могу использовать их по нескольким причинам:
Эти функции недоступны в старых версиях Python, с которыми мне нужна совместимость с (2.2)
Я хочу общее решение, которое можно назвать одинаково для разных баз
Я хочу разрешить базы, отличные от 2, 8, 16
Ответы:
Если вам нужна совместимость с древними версиями Python, вы можете использовать gmpy (который включает в себя быструю, полностью общую функцию преобразования в строку и может быть построен для таких древних версий), возможно, вам придется попробовать более старые версии, так как последние не были протестированы для почтенных выпусков Python и GMP, только несколько последних), или, для меньшей скорости, но большего удобства, используйте код Python - например, наиболее просто:
источник
gmpy2.digits(x, base)
.digs = string.digits + string.lowercase + string.uppercase
string.digits + string.letters
)x //= base
который ведет себя как/=
в Python 2 при отбрасывании десятичной дроби. Этот ответ должен включать отказ от ответственности, что это для Python 2.Удивительно, но люди давали только решения, которые конвертировались в маленькие базы (меньше длины английского алфавита). Не было попыток дать решение, которое преобразуется в любую произвольную базу от 2 до бесконечности.
Итак, вот супер простое решение:
так что если вам нужно преобразовать какое-то супер огромное число в базу
577
,numberToBase(67854 ** 15 - 102, 577)
, Даст вам правильное решение:[4, 473, 131, 96, 431, 285, 524, 486, 28, 23, 16, 82, 292, 538, 149, 25, 41, 483, 100, 517, 131, 28, 0, 435, 197, 264, 455]
,Который вы можете позже преобразовать в любую базу, которую хотите
источник
int(4545,16)
дал «11c1» иint(4545,60)
дал «1:15:45». Таким образом, функция выполняла тройную функцию: преобразование в десятичный, компьютерный и временной формат.digits
?ссылка: http://code.activestate.com/recipes/65212/
Помните, что это может привести к
для очень больших целых чисел.
источник
len(numerals)
, и (b)num % b
, к счастью, <len(numerals)
. Например, хотяnumerals
длина строки составляет всего 36 символов, baseN (60, 40) возвращается,'1k'
а baseN (79, 40) вызывает значениеIndexError
. Оба должны поднять какую-то ошибку. Код должен быть пересмотрен, чтобы вызвать ошибку, еслиnot 2 <= base <= len(numerals)
.b
не превыситlen(numerals)
, ну, удачи вам.return numerals[0] if num == 0 else baseN(num // b, b, numerals).lstrip(numerals[0]) + numerals[num % b]
такая же краткая.источник
0
не нужно. Вот документация по Python 2: docs.python.org/2/library/string.html#format-string-syntaxhex(100)[2:]
,oct(100)[2:]
иbin(100)[2:]
.Отличные ответы! Я думаю, что ответом на мой вопрос было «нет», я не упустил какое-то очевидное решение. Вот функция, которую я буду использовать, которая объединяет хорошие идеи, выраженные в ответах.
источник
рекурсивный
Я хотел бы упростить в наиболее проголосовали ответ на:
С тем же советом для
RuntimeError: maximum recursion depth exceeded in cmp
очень больших целых и отрицательных чисел. (Вы могли бы использоватьsys.setrecursionlimit(new_limit)
)итеративный
Чтобы избежать проблем с рекурсией :
источник
return BS[0] if not n
тогда условие остановки ? На всякий случай, если вы хотите использовать причудливые цифры, как я :)return BS[n] if n < b else to_base(n // b) + BN[n % b]
В Python нет встроенной функции для печати целого числа в произвольной базе. Вы должны написать свой собственный, если хотите.
источник
Вы можете использовать
baseconv.py
из моего проекта: https://github.com/semente/python-baseconvПример использования:
Есть несколько конвертеров bultin как например
baseconv.base2
, такbaseconv.base16
иbaseconv.base64
.источник
>>> numpy.base_repr(10, base=3) '101'
источник
clac
проблем с загрузкой. Предварительная загрузка numpy более чем в три раза увеличивает время выполнения простого вычисления выражений в clac: например,clac 1+1
от 40 мс до 140 мс.numpy.base_repr()
в качестве основы используется предел 36. В противном случае он выдаетValueError
http://code.activestate.com/recipes/65212/
Вот еще один по той же ссылке
источник
Я сделал пакет для этого.
Я рекомендую вам использовать мой Base.py https://github.com/kamijoutouma/bases.py, который был вдохновлен Base.js
обратитесь к https://github.com/kamijoutouma/bases.py#known-basesalphabets чтобы узнать, какие базы можно использовать
РЕДАКТИРОВАТЬ: pip-ссылка https://pypi.python.org/pypi/bases.py/0.2.2
источник
вывод:
источник
other-base
так же, какother - base
, так что вы должны использоватьother_base
decimal
ноль.источник
Рекурсивное решение для тех, кто заинтересован. Конечно, это не будет работать с отрицательными двоичными значениями. Вам нужно будет реализовать Дополнение Два.
источник
объяснение
В любой базе каждое число равно
a1+a2*base**2+a3*base**3...
«Миссия» - найти все.Для каждого
N=1,2,3...
кода выполняется изоляция сaN*base**N
помощью «mouduling» с помощью b, дляb=base**(N+1)
которого все срезы больше, чем N, и срезание всех a, что их серийный номер меньше N, уменьшая каждый раз, когда функция вызывается токомaN*base**N
.Base% (base-1) == 1 для этого base ** p% (base-1) == 1 и для этого q * base ^ p% (base-1) == q только с одним исключением, когда q = base-1 который возвращает 0. Чтобы исправить это в случае, если он возвращает 0, функция проверяет, равен ли он 0 с самого начала.
преимущества
в этом примере есть только одно умножение (вместо деления) и несколько moudulueses, что относительно занимает небольшое количество времени.
источник
источник
источник
Вот пример того, как преобразовать число любой базы в другую базу.
источник
источник
Еще один короткий (и более понятный ИМО):
И с правильной обработкой исключений:
источник
Другое решение, работающее с базами от 2 до 10, требует модификации для более высоких баз:
Пример:
источник
Вот рекурсивная версия, которая обрабатывает целые числа со знаком и пользовательские цифры.
источник
Строки не единственный выбор для представления чисел: вы можете использовать список целых чисел для представления порядка каждой цифры. Они могут быть легко преобразованы в строку.
Ни один из ответов не отклоняет базу <2; и большинство будет работать очень медленно или падать с переполнением стека для очень больших чисел (например, 56789 ** 43210). Чтобы избежать таких сбоев, уменьшите быстро, как это:
Speedwise,
n_to_base
сравнимо сstr
большими числами (около 0,3 с на моей машине), но если сравнивать сhex
вами, вы можете быть удивлены (примерно 0,3 мс на моей машине или в 1000 раз быстрее). Причина в том, что большое целое число хранится в памяти в базе 256 (байт). Каждый байт может быть просто преобразован в двухсимвольную шестнадцатеричную строку. Это выравнивание происходит только для оснований, имеющих степени двойки, поэтому существуют специальные случаи для 2,8 и 16 (и base64, ascii, utf16, utf32).Рассмотрим последнюю цифру десятичной строки. Как это связано с последовательностью байтов, которая формирует его целое число? Давайте маркировать байты
s[i]
сs[0]
будучи наименее значимыми (прямой порядок байтов). Тогда последняя цифраsum([s[i]*(256**i) % 10 for i in range(n)])
. Ну, бывает, что 256 ** i заканчивается 6 для i> 0 (6 * 6 = 36), так что последняя цифра равна(s[0]*5 + sum(s)*6)%10
. Отсюда видно, что последняя цифра зависит от суммы всех байтов. Это нелокальное свойство делает преобразование в десятичную сложнее.источник
источник
Ну я лично пользуюсь этой функцией, написанной мной
Вот как это можно использовать
print(to_base(7, base=2))
Вывод:
"111"
print(to_base(23, base=3))
Вывод:
"212"
Пожалуйста, не стесняйтесь предлагать улучшения в моем коде.
источник
источник
Это старый вопрос, но я подумал, что поделюсь с ним своим мнением, так как считаю, что это несколько проще, чем другие ответы (хорошо для оснований от 2 до 36):
источник
Я не видел никаких преобразователей поплавка здесь. И я пропустил группировку для всегда трех цифр.
ДЕЛАТЬ:
числа в научном выражении
(n.nnnnnn*10**(exp)
-'10'
этоself.baseDigits[1::-1]/self.to_string(len (self.baseDigits))
-from_string-функция.
1 -> римские цифры?
-репр комплекс с аглз
Итак, вот мое решение:
источник
вывод:
преобразовать в любую базу, обратное тоже легко.
источник
NameError: global name 'n' is not defined
. Является лиdivmod(x, n)
должно бытьdivmod(x, b)
?