第35講 10進数をn進数に翻訳する△ 
第7話 n進数を10進数に直すコードの解説

コード再掲
        String^ g(int a,int n){
           int k,i,w=0;
           k=(int)log10((double)a);
           for(i=k;i>-1;i--){
             if(i==k)w+=((int)(a/pow((double)10,(double)i)))*((int)pow((double)n,(double)i));
             if(i<k)w+=(((a%((int)pow((double)10,(double)(i+1))))/((int)pow((double)10,(double)i)))*((int)pow((double)n,(double)i)));
           }
           return(w.ToString());
        }
このコードは入力されている文字列を行った十進数で表された数字として最初に受け取り、
そのn進数が表す数を10進数に翻訳しています。
例えば、4321を書いてあったら最初は、四千三百二十一として受け取り、
次にそれを数字の列4,3,2,1として取り出し
5進数なら
4×5の3乗+3×5の2乗+2×5+1とすることによってn進数を10進数に翻訳しています。

まず、log10(x);は10を底とするxの対数を返すものです。
小数部分を切り捨てると、整数の桁数-1になります。
例えば4桁の整数であれば
log101000=3、、log1010000=4(常用対数の答えは0の個数です。)
ですから、log104321=3.・・・となりますので、桁数は4桁であることがわかります。
log10とpow 関数(pow (a,b)なら、aのb乗を計算する関数)はいずれも<math.h>にありますので、
冒頭でこれをインクルードしておく必要があります。
#pragma once
#include <math.h>
namespace 10進数をn進数に翻訳する {
      ・
      ・
      ・

さて、log104521=3.・・・の小数部分を切り捨て3になりますが、
4521=4000+500+20+1
と表現したときの4000の0の個数になります。
for文はこの3から始まり、0まで繰り返します。
以降トレースしてみましょう。

i=3のとき、
if(i==k)w+=((int)(a/pow((double)10,(double)i)))*((int)pow((double)n,(double)i));こちらのif文が実行されます。
これは何をしているかといいますと、10の3乗で割り小数部分を切り捨ててから、それにnの3乗をかけています。
4521÷1000=4.521→4→4×5の3乗(5進数で表記すれば4000)ですね。
(尚、pow 関数を使うとき、pow (a,b)のaとbはdoubleで入力する設定になっていますので、
((double)10,(double)iとそれぞれを強制的にdoubleに変更しています。
こうしないとエラーします。
言い忘れましたが、log10(x)のxもやはりdoubleで入れないとエラーしますので、
k=(int)log10((double)a) 強制的にキャストしています。)
つまり、
4521=4000+500+20+1
と表現したときの最初の4000(5進数表記)とりだし、
wに加えられます。
wは0に初期化されていますから
w=4×5の3乗となります。
i=2の以降は、if文if(i<k)w+=(((a%((int)pow((double)10,(double)(i+1))))/((int)pow((double)10,(double)i)))*((int)pow((double)n,(double)i)));
の方が実行されます。
最初に、10の3乗で割った余りを求め、それを10の2乗で割り小数部分を捨ててから、nの2錠をかけています。
4521÷1000=4・・・521→521÷100=5.21→5→5×5の2乗=500(5進数表記)で
4521=4000+500+20+1の2番目の500がwに加えられます。
これでw=4×5の3乗+3×5の2乗となります。
i=3のときは、
4521÷100=45・・・21→21÷10=2.1→2→2×5=20(5進数表記)
で4521=4000+500+20+1の3番目の200がwに加えられ、
w=4×5の3乗+3×5の2乗+2×5
最後i=4のときは、
4521÷10=452・・・1→1×1×1  というのは10の0乗=1、nの0乗=1だからです。
すると
w=4×5の3乗+3×5の2乗+2×5+1で5進数の4521が見事に10進数に翻訳されています。

さて、本講最後の課題です。
今回作ったソフトは、n進数を10進数に直す方は、桁が小さい内は正常に動くのですが、
c++ぐらいになると、
入門とエラー表示が出てしまいます。
これの改善を考えてください。少なくとも、20桁ぐらいまではできるようにしたいものです。


第6話へ 第8話へ


戻る

VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)