任意の位置番号システムでは、任意の数 (小数であっても) は sum(d i * base i ) として表されます。ここで、d iはi
- 番目の桁 (右から左に数えられる) であり、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
他の言語も同様の変換関数を提供しており、そのほとんどは文字列処理ライブラリに含まれています。