こんにちは。
今回は基数変換を書くことにしました。
意外と使われていないのかわからないですが、自分はたまに使うのでメモとして残しておきます。
#考え方。
まず10進数で考えてみましょう。
1を次の桁に送るときは10進数なら10をかけますね。
そうすると1->10になりますね。簡単簡単。
では、N進数ならどうでしょう。同じ要領で。
1を次の桁に送るときはN進数ならNをかけますね。
そうすると1->10(N進数)になりますね。
基本的にはこれだけ。
逆もあります。
10の2桁目を下の桁に移動したい時は、10を割りますね。
そうすると10->1になりますね。
同じ要領で。
10(N進数)の2桁目を下の桁に移動したい時は、Nを割りますね。
そうすると10(N進数)->1になりますね。
#大事な事
例えば。
4進数の10では自然数で4であるのに対して、
5進数の10では自然数で5であるのです。
見た目は同じですが、内容量は変わっています。
気をつけましょう。
#何に使うか
ゲームなんかではスコアを表示するときに各桁の数字が欲しいときがあるのですが、そういうときにも使えます。
私は数学が赤点だったので数学的な意味は知りませんが、たまたま使う機会があったので作りました。
#コード全容
基数変換全容
#include <iostream>
#include <deque>
#include <cstdint>
#include <string>
typedef std::deque<std::uintmax_t> DType;
DType MakeRadix(std::uintmax_t N,const std::uintmax_t& R) {
DType D;
if (N == 0) {
D.push_front(0);
return D;
}
while (N != 0) {
D.push_front(N % R);
N /= R;
}
return D;
}
std::uintmax_t MakeNumber(const DType& D, const std::uintmax_t R) {
std::uintmax_t V = 0;
if (D.size() == 0) { return 0; }
for (std::size_t i = 0; i <D.size() ; i++) {
V *= R;
V += D[i];
}
return V;
}
int main() {
std::uintmax_t N = 100;
std::string Ch = "0123456789";
DType D = MakeRadix(N, Ch.size());
for (auto& o : D) {
std::cout << Ch[o];//show each character.
}
std::cout << std::endl;
std::uintmax_t V = MakeNumber(D, Ch.size());
std::cout << V << std::endl;
return 0;
}