2010-03-07 3 views
2

ВопросПреобразование базы 10

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

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

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


Пример:

Input: "10101010110101" 

-

Output: "10933" 
+1

В принципе, Вы должны выполнить деление на 10 для произвольной точности числа в базе N. – AraK

+0

Если ограничение о количестве будучи «больше, чем система может работать с» средствами что вы не можете делать математику с цифрами вообще, тогда ничего не поделаешь. Однако, если вы можете использовать какой-то большой целочисленный пакет, ну, вы бы просто использовали это :-) Конечно, вы могли бы реализовать свой собственный большой целочисленный пакет, я думаю ... – Pointy

ответ

1

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

0

Это из курса по информатике на базе Python, который я взял в прошлом семестре, который предназначен для обработки до base-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 = "ABCDEF" 
    # 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, которая используется как числовое значение.

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

[214748364, 8]

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

+0

Выглядит очень круто. Hoewver Я не вижу, где вы делаете массив. Можете ли вы прокомментировать код? (Я не знаю python) – Cam

+0

@incrediman: Нет массива. Python поддерживает целые числа произвольной длины изначально. И произвольные базы от 2 до 36, а также через 'int()'. –

+0

Цифры. Я был уверен, что это было так, как это работает, поскольку в коде нет операций с строками или массивами из того, что я вижу, но я его запускал, и это было успешным. Я подумал, что, возможно, '+' выполнял операцию с массивом или строкой, но, видимо, нет. Думаю, это не так полезно, как я думал. – Cam

0

Вот некоторые 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, и т.д.)

редактировать: ой не видите код питон :) да, кулер

0

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

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

>> (expt 2 (expt 2 20) 

В LISP вы можете легко представить шестигранник, реш оКТ и бункер следующий

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

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

>> #36rABCDEFGHIJKLMNOPQRSTUVWXYZ 
8337503854730415241050377135811259267835 

Для получения более подробной информации о номерах в LISP Престола: Practical Common Lisp Book