如何将Base 20数字转换为十进制?

时间:2014-04-13 04:22:25

标签: math type-conversion hexavigesimal

在任何地方找不到好的例子。如何将Base 20数字转换为十进制?我正在使用vigesimal数字。我知道如何从Vigesimal转换为十进制,这部分很容易。但我正试图从Vigesimal转换回十进制(整数),我不知道该怎么做。有人有什么好例子吗? 顺便说一句,我正在使用c ++。

例如,我试图找出一种算法,它将12的Vigesimal数转换为十进制等值,即22(整数)。或类似的东西:

30(整数)= 1A(极大)

提前致谢,

3 个答案:

答案 0 :(得分:1)

这真的只是基本的数学。我们假设你拥有的数字是一个字符串。然后(伪代码)

number = "AF8";
base = 20;
result = 0;
for each c in number:
  temp = numberValueOf(char)
  result = base * result + temp

print "converting ", number, " results in ", result

此处,numberValueOf函数将字符0转换为9为其等效值,A转换为J成为10 19

答案 1 :(得分:1)

这是两种方式(Vigesimal到Decimal和Decimal到Vigesimal)

#!/usr/bin/env python

 def convert(vigisemal):
    i = int(vigisemal, 20)
    return i


 def tovigisemal(decimalstring):
     dec = int(decimalstring)
    x = (dec % 20)
    digits = "0123456789ABCDEFGHIJ"
    rest = dec / 20
    if (rest == 0):
        return digits[x]
    return tovigisemal(rest) + digits[x]


if __name__ == '__main__':
    print(convert("H1"))
    print(tovigisemal("341"))

基于Lynch's Answer

答案 2 :(得分:0)

在任何位置编号系统中,任何数字(偶数小数)都表示为sum(d i * base i ),其中d i i中的数字(从右到左计数),d 0 是小数点左边第一个位置的数字。为了便于评估,可以使用Horner's rule

“折叠”总和
(((d[n]*base + d[n-1])*base + d[n-2])*base + d[n-3])*base + ...

关于这个问题的好处是,可以从最重要的数字开始,然后按照数字在内存或文件字符串中排序的方式向右移动。

string number = "1A";
int decimal = 0;

for (string::const_iterator it = number.begin(); it != number.end(); it++)
   decimal = decimal * base + to_int(*it);

to_int()应该注意将字符转换为十进制值,例如

int to_int (char d) {
  if ('0' <= d && d <= '9')
    return d - '0';
  else if ('A' <= d && d <= 'J')
    return 10 + (d - 'A');
  else
    throw some error
}

C ++提供方便的stoi()函数,为您计算数学:

#include <string>
#include <iostream>

using namespace std;

int main (void) {
  string number = "1A";

  cout << number << " in decimal is " << stoi(number, 0, 20) << endl;
}

编译并运行:

$ clang++ -o visc visc.cc && ./visc
1A in decimal is 30

在C中,可以使用strtol()并将基数设置为20.但它应该在输入标记器中使用并修改其输入参数,因此应该小心。

在Python中,string模块为atoi()提供了可选择的基础:

>>> from string import atoi
>>> atoi("1A", 20)
30

其他语言也提供类似的转换函数,主要在其字符串处理库中找到。