Преобразование в базу 10

Вопрос

Допустим, у меня есть строка или массив, который представляет число по основанию N, N>1, где N — степень двойки. Предположим, что представляемое число больше, чем система может обработать как фактическое число (целое или двойное число). и т.д).

Как я могу преобразовать это в десятичную строку?

Я открыт для решения для любой базы N, которая удовлетворяет вышеуказанным критериям (двоичный, шестнадцатеричный,...). То есть, если у вас есть решение, которое работает хотя бы для одной базы N, мне интересно :)


Пример:

Input: "10101010110101"

-

Output: "10933"

person Cam    schedule 07.03.2010    source источник
comment
По сути, вам нужно реализовать деление на 10 для вашего произвольного числа точности в базе N.   -  person AraK    schedule 08.03.2010
comment
Если ваше ограничение о том, что число больше, чем может обработать система, означает, что вы вообще не можете выполнять какие-либо математические операции с числами, то ничего не поделаешь. Однако, если вы можете использовать какой-то большой целочисленный пакет, вы бы просто использовали его :-) Конечно, я думаю, вы могли бы реализовать свой собственный большой целочисленный пакет...   -  person Pointy    schedule 08.03.2010


Ответы (4)


Это зависит от конкретного языка. Некоторые из них имеют встроенную поддержку целых чисел произвольной длины, а другие могут использовать библиотеки, такие как GMP. После этого нужно просто найти в таблице цифровое значение, а затем умножить его соответствующим образом.

person Ignacio Vazquez-Abrams    schedule 07.03.2010

Это из курса информатики на основе Python, который я прошел в прошлом семестре и предназначен для работы с базой 16.

import string

def baseNTodecimal():
    # get the number as a string
    number = raw_input("Please type a number: ")
    # convert it to all uppercase to match hexDigits (below)
    number = string.upper(number)
    # get the base as an integer
    base = input("Please give me the base: ")
    # the number of values that we have to change to base10
    digits = len(number)
    base10 = 0
    # first position of any baseN number is 1's
    position = 1
    # set up a string so that the position of
    # each character matches the decimal
    # value of that character
    hexDigits = "0123456789ABCDEF"
    # for each 'digit' in the string
    for i in range(1, digits+1):
        # find where it occurs in the string hexDigits
        digit = string.find(hexDigits, number[-i])
        # multiply the value by the base position
        # and add it to the base10 total
        base10 = base10 + (position * digit)
        print number[-i], "is in the " + str(position) + "'s position"
        # increase the position by the base (e.g., 8's position * 2 = 16's position)
        position = position * base
    print "And in base10 it is", base10

По сути, он принимает ввод в виде строки, а затем проходит и складывает каждую «цифру», умноженную на позицию по основанию 10. Каждая цифра фактически проверяется на ее положение индекса в строке hexDigits, которая используется в качестве числового значения.

Предполагая, что число, которое он возвращает, на самом деле больше, чем поддерживает язык программирования, вы можете создать массив целых чисел, представляющих все число:

[214748364, 8]

будет представлять 2147483648 (число, которое Java int не может обработать).

person David Antaramian    schedule 07.03.2010
comment
Выглядит очень круто. Однако я не вижу, где вы делаете массив. Можете ли вы прокомментировать код? (я не знаю питона) - person Cam; 08.03.2010
comment
@incrediman: массива нет. Python изначально поддерживает целые числа произвольной длины. А также произвольные базы от 2 до 36 через int(). - person Ignacio Vazquez-Abrams; 08.03.2010
comment
Цифры. Я был почти уверен, что именно так это и работает, поскольку в коде нет операций со строками или массивами, насколько я вижу, но я запустил его, и он был успешным. Я думал, что, возможно, + выполняет операцию с массивом или строкой, но, видимо, это не так. Думаю, это не так полезно, как я думал. - person Cam; 08.03.2010
comment
В моем коде нет массива. Я просто указал, что в качестве примера вы можете поддерживать очень большие десятичные числа в языках, которые не могут поддерживать целые числа, превышающие определенное значение. Как упомянул Игнасио, Python очень хорошо поддерживает большие десятичные числа. - person David Antaramian; 08.03.2010
comment
Ну, может быть, я просто неправильно понял, что вы имели в виду. Думаю, я не понимаю, как превратить его в массив после использования его как int может помочь. - person Cam; 08.03.2010
comment
Python был просто примером, который у меня был под рукой. В любом языке, где целые числа произвольной длины не поддерживаются, вам нужно будет проверить, будет ли результат (строка base10 = base10 + (position * digit) в моем коде) переполнять int или decimal, и приспособиться по мере необходимости. Как вы это сделаете, зависит от того, как вы собираетесь использовать это большое число позже. Если это для вывода, вы можете просто создать строку, поскольку презентация имеет значение. В противном случае вам, вероятно, придется определить свою собственную структуру, которая разбивает число на более мелкие числа (отсюда и мое предложение массива). - person David Antaramian; 08.03.2010
comment
Справедливо :) ... К сожалению, в моей среде нет чисел произвольной длины. В любом случае, это интересный фрагмент кода! - person Cam; 08.03.2010

Это какой-то php-код, который я только что написал:

function to_base10($input, $base)
{
  $result = 0;
  $length = strlen($input);
  for ($x=$length-1; $x>=0; $x--)
    $result += (int)$input[$x] * pow($base, ($length-1)-$x);
  return $result;
}

Это очень просто: просто переберите каждый символ входной строки.

Это работает с любым основанием ‹10, но его можно легко расширить для поддержки более высоких оснований (A-> 11, B-> 12 и т. д.).

edit: о, я не видел код Python :) да, это круче

person framp    schedule 08.03.2010

Я бы выбрал язык, который более или менее изначально поддерживает математическое представление, такое как «лисп». Я знаю, кажется, что все меньше и меньше людей используют его, но он по-прежнему имеет свою ценность.

Я не знаю, достаточно ли это для вашего использования, но самое большое целое число, которое я мог представить в моей общей среде lisp (CLISP), было 2 ^ (2 ^ 20)

>> (expt 2 (expt 2 20)

В lisp вы можете легко представить hex, dec, oct и bin следующим образом:

>> \#b1010 
10
>> \#o12
10
>> 10
10
>> \#x0A
10

Вы можете писать рациональные числа в других основаниях от 2 до 36 с #nR

>> #36rABCDEFGHIJKLMNOPQRSTUVWXYZ
8337503854730415241050377135811259267835

Дополнительную информацию о числах в lisp см. в Practical Common Lisp Book.

person sebs    schedule 23.02.2011