问题
假设我有一个字符串或数组表示基数为N的数字,N> 1,其中N是2的幂。假设所表示的数字大于系统可以处理的实数(int或双等)。
如何将其转换为十进制字符串?
我愿意接受满足上述标准(二进制,十六进制......)的任何基数N的解决方案。那就是如果你有一个适用于至少一个基数N的解决方案,我很感兴趣:)
示例:
Input: "10101010110101"
-
Output: "10933"
答案 0 :(得分:1)
这取决于特定的语言。有些人对任意长度的整数有本机支持,而其他人可以使用GMP之类的库。之后,只需在表格中查找数字值,然后适当地进行乘法。
答案 1 :(得分:0)
这是我上个学期开设的基于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
中的索引位置,该字符串用作数值。
假设它返回的数字实际上大于编程语言支持的数字,你可以建立一个代表整个数字的Ints数组:
[214748364, 8]
代表2147483648(Java int
无法处理的数字)。
答案 2 :(得分: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等)
编辑:哦没看到python代码:) 是的,那更酷了答案 3 :(得分:0)
我会选择一种或多或少支持本机数学表示的语言,如'lisp'。我知道人们似乎越来越少地使用它,但它仍然有它的价值。
我不知道这是否足够大,但我在公共lisp环境(CLISP)中可以表示的最大整数是2 ^(2 ^ 20)
>> (expt 2 (expt 2 20)
在lisp中,您可以轻松地表示hex,dec,oct和bin,如下所示
>> \#b1010
10
>> \#o12
10
>> 10
10
>> \#x0A
10
您可以使用#nR
在2到36的其他基础上写出有理数>> #36rABCDEFGHIJKLMNOPQRSTUVWXYZ
8337503854730415241050377135811259267835
有关lisp中数字的详细信息,请参阅:Practical Common Lisp Book