【问题标题】:How do I convert a Base 20 number to decimal?如何将 Base 20 数字转换为十进制?
【发布时间】:2014-05-27 04:08:00
【问题描述】:

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

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

30(整数)= 1A(数字)

提前致谢,

【问题讨论】:

  • 您确实意识到您的陈述“我知道如何从 Vigesimal 转换为十进制,这部分很容易。但我正在尝试从 Vigesimal 转换回十进制”可能令人困惑。根据其余的上下文,我想我知道您的意思-但您确实有点自相矛盾。也许想编辑问题?

标签: math type-conversion hexavigesimal


【解决方案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 到它们的等效值,并将 AJ 转换为 1019

【讨论】:

    【解决方案2】:

    在任何位置数字系统中,任何数字(偶数小数)都表示为 sum(di * basei),其中 di sub> 是i-th 位的数字(从右到左计数),d0 是小数点左侧第一个位置的数字。为了便于评估评估,可以使用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
    

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

    【讨论】:

      【解决方案3】:

      这是双向的(Vigesimal to Decimal 和 Decimal to 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-04
        • 1970-01-01
        • 2014-03-19
        • 2011-08-25
        • 2014-04-28
        • 2021-09-30
        • 1970-01-01
        相关资源
        最近更新 更多