第27講 n進数演算−−−加法その1
第7話 n進法演算の考え方

加法の仕組みが理解できたところで、
いよいよ加法のプログラムを組んでみることにしましょう。
プログラム冒頭に、グローバル変数

Dim n As Integer
を宣言しておいて、
Private Sub CommandButton1_Click()
の一番最初に
  n=Cells(5, 1)
などとしておけば、何進数を扱うのかをエクセルのシート上から、
指定することが出来ます。
n進数を納めるにには、
整数型の1次元配列
Dim a(10000) As Integer,b(10000) As Integer
等を用意しておくとよいでしょう。
データはn進数をランダムに2つ発生させて、
表示するプログラムを考えてください。
尚、ランダムデータは最初は10桁以内にしましょう。
それから、データの終わりには終わりの印として、
a(最後)=n
のようにnを代入しましょう。
nをどうしてデータの終わりの印として使えるかと申しますと、
例えば、5進法(数)で考える場合、
1201
のように5未満の数字が並びます。
ですから、5が入ることがないのです。
それで、
1201
となります。
ではなぜ、終わりの印を入れる必要があるのでしょうか。
Dim a(10000) As Integer,b(10000) As Integer
とりあえず、最初の方は10桁以内で考えますが、
将来的には、10000桁まで扱えるように、
配列の要素数を10000までしてあります。

vbaでは、
変数を宣言した時点で、
0に初期化されますが、プログラムの実行が2回目以降だと、
前に代入した値が入っていて、いたずらをしますから、
配列の各要素は0に初期化しておきましょう。

0に初期化しておきますので、
終わりの印を入れないと1201の場合には、
000〜0001201
のようになります。0が9996個並ぶことになります。
a(0)=1,a(1)=0,a(2)=2,a(3)=1,a(5)=0,a(6)=0,a(7)=0,a(8)=0,・・・・
と並んでいますから、For文で表示する場合終わりの印を入れておかないと、
終了場所が分からず、
毎回1万個も数字が並ぶことになります。
ですが、
000〜0051201
すなわち、
a(0)=1,a(1)=0,a(2)=2,a(3)=1,a(4)=5(終わり記号n),a(6)=0,a(7)=0,a(8)=0,・・・・
となっていれば、
For i=0 to 9999
   If a(i)=n Then Exit For
   Cells(□,9999-i)=a(i)
   ・・・
   ・・・
Next
と終わりの印nの直前までを表示して、
p
図の4行目のようになります。このように、
a(0)=1,a(1)=0,a(2)=2,a(3)=1
4個の数字の羅列で終了することが出来ます。
つまり、For文を5回のループで終了することが出来るのです。
5回目のときにIf a(i)=n Then Exit ForによってFor文が強制終了されるからです。
For文を途中で止めて、無駄な0を表示しないにしようということです。

nを
10とすると10進数の10万桁の巨大整数を、

100とすると10進数の100万桁の巨大整数を、
1000とすると10進数の1000万桁の巨大整数を、

処理すること出来ます。
将来的には、
78203698402697125026987003591206981111
(この例とて、たったの50桁です。
1000万桁が途方もなく大きいことが分かります。)
のような巨大な整数を考え、
その整数の因数分解
d
や素数判定などを扱うことを
目標にしていますので、
配列の要素数を多めの1万にとってあるのです。
巨大素数生成などでは、
コンピュータに多大な負担を与えます。
毎回、For文で1万回もループさせていたのでは、
さすがのコンピュータでも、
50桁程度の素数でさえ、

作り出すことは大変困難です。
巨大整数演算では、
無駄なループはさせないことが、
絶対的な要件となります。
不必要なループをさせないために、
終わりの印を入れるのです。
終わりの印はn以上であればよいので、
n+1などでも結構です。
この辺は、プログラマーが決めればよいことなのです。


では、次のようデータを発生させるマクロを組みましょう。
o
上の7進数の例では、1つ目の5進数の桁数が6桁で
a(5)=5,a(4)=4,a(3)=1,a(2)=3,a(1)=6,a(0)=2
2つ目の桁数が7桁となっており、
b(6)=5,b(5)=0,b(4)=6,b(3)=1,b(2)=5,b(1)=1,b(0)=5
となっています。
それぞれの桁数も10桁以内のランダムな桁数としてください。

それから、4桁のn進数の場合、
4桁目(a(3)ですよ。添え字が0から始まることを忘れないでください。)
が0であってはいけませんね。
0010
なら2桁になってしまいます。
ですから、印しであるnが入っている一つ前の添え字のときには、
0の代入を禁じなければなりません。
以上のことを考慮に入れると、
ランダムデータを作り、表示させるだけのプログラムでも結構難しいということが、
お分かりかと思います。
参考ダウンロード添付ファイル
を開いて下の空白部分をプログラミングしてみて下さい。
Dim n As Integer
Private Sub CommandButton1_Click()
  Dim a(14) As Integer
  Dim b(14) As Integer
  n = Cells(2, 16)
  Rows("3:20000").Select
  Selection.ClearContents
  Cells(2, 1).Select
  Call ds(a())
  Call ds(b())
  Call hy(a(), 3) '()ないの2番目の整数は表示する行数を指定している
  Call hy(b(), 4)
End Sub
Sub sy(a() As Integer)
Dim i As Integer

End Sub
Sub ds(a() As Integer)

End Sub
Sub hy(a() As Integer, g As Integer)

End Sub
Private Sub CommandButton2_Click()
  Rows("3:20000").Select
  Selection.ClearContents
  Cells(1, 1).Select
End Sub





第6話へ 第8話へ

004

eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
専門用語なしの C言語 C++ 入門(Visual C++ 2010で学ぶ C言語 C++ 入門)
専門用語なしの excel vba マクロ 入門 2013 2010 2007 対応講義 第1部
Visual C++ によるC言語 入門 C++ 入門 基礎から応用まで
本サイトトップへ