在任何地方找不到好的例子。如何将Base 20数字转换为十进制?我正在使用vigesimal数字。我知道如何从Vigesimal转换为十进制,这部分很容易。但我正试图从Vigesimal转换回十进制(整数),我不知道该怎么做。有人有什么好例子吗? 顺便说一句,我正在使用c ++。
例如,我试图找出一种算法,它将12的Vigesimal数转换为十进制等值,即22(整数)。或类似的东西:
30(整数)= 1A(极大)
提前致谢,
答案 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"))
答案 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
其他语言也提供类似的转换函数,主要在其字符串处理库中找到。