2

どこにも良い例が見つかりません。基数 20 の数値を 10 進数に変換するにはどうすればよいですか? 私は十数個の数を扱っています。Vigesimal から 10 進数に変換する方法を知っています。その部分は簡単です。しかし、Vigesimal から 10 進数 (整数) に変換しようとしていますが、これを行う方法がわかりません。誰にも良い例はありますか?ちなみに私はc++を使用しています。

たとえば、12 の Vigesimal 数を 22 (整数) に相当する 10 進数に変換するアルゴリズムを見つけようとしています。または次のようなもの:

30 (整数) = 1A (ビギセマル)

前もって感謝します、

4

3 に答える 3

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"))

リンチの回答に基づく

于 2016-08-17T10:16:55.187 に答える
0

任意の位置番号システムでは、任意の数 (小数であっても) は sum(d i * base i ) として表されます。ここで、d ii- 番目の桁 (右から左に数えられる) であり、d 0はその桁です。小数点の左の最初の位置。評価を簡単にするために、ホーナーのルールを使用して合計を「折りたたむ」ことができます。

(((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()文字を 10 進数値に変換する必要があります。

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

Cstrtol()では、基数を 20 に設定して使用できます。ただし、入力トークナイザーで使用することを想定しており、その入力引数を変更するため、注意が必要です。

Python では、stringモジュールはatoi()選択可能なベースを提供します:

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

他の言語も同様の変換関数を提供しており、そのほとんどは文字列処理ライブラリに含まれています。

于 2014-04-13T21:46:39.517 に答える