第18講 n進数演算−−−加法
第3話 n進数の加法その2
201012(3)+1202101(3)
の答え
0+0=0
0+1=1
0+2=2
1+0=1
1+1=2
1+2=10
2+0=0
2+1=10
2+2=11
以外の規則を使っていないことが分かります。
加法の仕組みが理解できたところで、
いよいよ加法のプログラムを組んでみることにしましょう。
n進数を納めるには、
整数型の1次元配列
Dim a(10000) As Integer,b(10000) As Integer
等を用意しておくとよいでしょう。
データはn進数をランダムに2つ発生させて、
表示するプログラムを考えてください。
尚、ランダムデータは最初は10桁以内にしましょう。
第16講と第17講では
201012
の場合
a(0)=2,a(1)=0,a(2)=1,a(3)=0,a(4)=1,a(5)=2
としていましたが、
第1位を合わせるために、
201012を逆順に
a(0)=2,a(1)=1,a(2)=0,a(3)=1,a(4)=0,a(5)=2
と収納することにした方がよいでしょう。
a(0)=2,a(1)=0,a(2)=1,a(3)=0,a(4)=1,a(5)=2(第16講と第17講のやり方)
a(0)=2,a(1)=1,a(2)=0,a(3)=1,a(4)=0,a(5)=2
上位の桁と下位の桁の数字を入れ替えるということです。
それから、データの終わりには終わりの印として、
a(最後)=n
のようにnを代入しましょう。
nをどうしてデータの終わりの印として使えるかと申しますと、
例えば、5進法(数)で考える場合、
4203
のように5未満の数字が並びます。
ですから、5が入ることがないのです。
それで、
54203
となります。
ではなぜ、終わりの印を入れる必要があるのでしょうか。
Dim a(10000) As Integer,b(10000) As Integer
とりあえず、最初の方は10桁以内で考えますが、
将来的には、10000桁まで扱えるように、
配列の要素数を10000までしてあります。
VBAの場合、変数や配列は宣言すると自動的に0に初期化されていますから、
終わりの印を入れないと
000〜0004203
のようになります。0が9996個並ぶことになります。
a(0)=3,a(1)=0,a(2)=2,a(3)=4,a(5)=0,a(6)=0,・・・・
と並んでいますから、Do文で表示する場合終わりの印を入れておかないと、
終了場所が分からず、
毎回1万個も数字が並ぶことになります。
ですが、
000〜0054203
すなわち、
a(0)=3,a(1)=0,a(2)=4,a(3)=2,a(4)=5(終わり記号),a(6)=0,・・・・
となっていれば、
Do While 1
If a(i)=n Then Exit Do
Cells(*,**+i)=a(i)
・・・
・・・
Loop
と終わりの印nの直前までを表示して、
4203
と4個の数字の羅列で終了することが出来ます。
つまり、Do文を5回のループで終了することが出来るのです。
nを
10とすると10進数の10万桁の巨大整数を、
100とすると10進数の100万桁の巨大整数を、
1000とすると10進数の1000万桁の巨大整数を、
処理すること出来ます。
将来的には、
78203698402697125026987003591206981111
(この例とて、たったの50桁です。
1000万桁が途方もなく大きいことが分かります。)
のような巨大な整数を考え、
その整数の因数分解や
素数判定などを扱うことを
目標にしていますので、
配列の要素数を多めの1万にとってあるのです。
巨大素数生成などでは、
コンピュータに多大な負担を与えます。
毎回、Do文で1万回もループさせていたのでは、
さすがのコンピュータでも、
50桁程度の素数でさえ、
作り出すことは大変困難です。
巨大整数演算では、
無駄なループはさせないことが、
絶対的な要件となります。
不必要なループをさせないために、
終わりの印を入れるのです。
終わりの印はn以上であればよいので、
n+1などでも結構です。
この辺は、プログラマーが決めればよいことなのです。
それでは、順を追ってマクロを組んでいきましょう。
データ発生マクロを組んだ後に、加法プログラムを考えることにします。
まず2つのデーを発生させて、
のように右揃えで表示させて下さい。
右揃えにする理由は、筆算では右揃えになっているからです。
ひとます空けている理由は、
足し算結果が繰り上がりで、1つ桁数が上がる可能性があるからです。
この6進数の例では、1つ目の2進数の桁数が9桁で
a(0)=0,a(1)=3,a(2)=5,a(3)=4,a(4)=0,a(5)=2,a(6)=2,a(7)=4,a(8)=1,a(9)=6(終わり記号)
2つ目の桁数が8桁となっており、
b(0)=1,b(1)=3,b(2)=0,b(3)=1,b(4)=1,b(5)=2,b(6)=2,b(7)=2,b(8)=6(終わり記号)
となっています。
それぞれの桁数も10桁以内のランダムな桁数としてください。
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
vc++講義へ
excel 2013 2010 2007 vba入門へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
専門用語なしの C言語 C++ 入門(Visual C++ 2010で学ぶ C言語 C++ 入門)
専門用語なしの excel vba マクロ 入門 2013 2010 2007 対応講義 第1部
eclipse java 入門へ
excel 2016 vba 入門へ
小学生からエンジニアまでのRuby入門へ
本サイトトップへ