第28講 n進数演算−−−加法その2
第3話 n進法足し算プログラム解説その2
プログラム主要部分再掲
Sub ts(a() As Integer, b() As Integer, c() As Integer)
  Dim i As Integer, j As Integer
  Dim d(14) As Integer, e(14) As Integer
  Call sy(d())
  Call sy(e())
  Dim asz As Integer, bsz As Integer
  asz = cp(d(), a()) '終わり記号nをなくし、サイズを取得
  bsz = cp(e(), b()) '終わり記号nをなくし、サイズを取得
  Dim max As Integer
  max = asz
  If bsz > max Then max = bsz
  For i = 0 To max
    c(i) = c(i) + d(i) + e(i)
    c(i + 1) = c(i + 1) + Int(c(i) / n)
    c(i) = c(i) Mod n
  Next
  If c(max + 1) > 0 Then c(max + 2) = n Else c(max + 1) = n
End Sub

今回からは、プログラムの核=エンジンといえる部分を解説していきましょう。
  Dim asz As Integer, bsz As Integer
  asz = cp(d(), a()) '終わり記号nをなくし、サイズを取得
  bsz = cp(e(), b()) '終わり記号nをなくし、サイズを取得
  Dim d(14) As Integer, e(14) As Integer
  Call sy(d())
  Call sy(e())
は、1次元配列dとeを用意してすべての要素を0に初期化しています。
dとeの主要な任務は、
前回述べたように、終わり記号nを取り去りそれを0に置き換えることですが、
わざわざ配列を用意するのは、
もとの配列aとbのデータはいじりたくないからです。
もちろん、配列dとeを用意しないで、
一時的にaとbのnのところを0に置き換えるという手もありますが、
nのある場所をFor文で探さなければなりませんから、
スピードアップという点では貢献はほとんどありません。
また、
dとeは、動的変数(ローカル変数)ですから、
サブプロシージャの任務が終わると同時に消滅します。
メモリーは一時的には使いますが、
tsの終了と共にすぐに解放されますから、
メモリーの浪費ともいえません。
将来的には、何百桁から何万桁の巨大整数を扱うことを目的にしていますから、
メモリーの節約という観点は、大変大切ですが、
動的変数(ローカル変数)を一時的に使うのは、
大きな問題とはいえません。
また、aとbのnのところを0に置き換えた場合、
最後に再び0戻さなければならない点が、煩雑であるといえます。

尚、配列の要素数14としていますが、
いきなり1万としたのでは、
頭が混乱しますから、とりあえず要素数を小さくしているのです。
  Dim max As Integer
  max = asz
  If bsz > max Then max = bsz

の3行の任務は、
データaと

13 12 11 10  9 8 7 6 5 4  3 2 1 0

データbの

13 12 11 10  9 8 7 6 5 4  3 2 1 0

サイズの大きい方を取得することにあります。
ここでサイズといっているのが、
nの手前の数字の位が左から数えて何番目かを表しています。
上の例ではaは、6になります。
ただし、配列の添え字が0から始まっていますから、
7番目です。
配列の添え字が0から始まっていることを考慮に入れると、
Function cp(x() As Integer, y() As Integer)
  Dim i As Integer
  For i = 0 To 14
    If y(i) = n Then
      cp =
i - 1
      Exit Function
    End If
    x(i) = y(i)
  Next
End Sub

Function cp(x() As Integer, y() As Integer)
  Dim i As Integer
  For i = 0 To 14
    If y(i) = n Then
      cp =
i
      Exit Function
    End If
    x(i) = y(i)
  Next
End Sub
でもよかったわけです。

13 12 11 10  9 8 7 6 5 4  3 2 1 0

すなわち、3245602は7桁ですから、
      cp = i
      Exit Function
には十分な理由があります。
76のどちらをサイズと定義するかは、
結局はプログラマーの好みに任されています。
ただ、プログラマーはに対応する添え字7をサイズと定義したのか、
1つ手前のに対応する添え字6をサイズと定義したのかは、
覚えておかなければなりません。
このサイズは、For文の終了のタイミングを決めるものです。
今回は、 1つ手前のに対応する添え字6をサイズと定義してますから、
  For i = 0 To max
となっていますが、
もし、に対応する添え字
7をサイズと定義した場合には、
  For i = 0 To max-1
となります。

データa

13 12 11 10 9 8 7 6 5 4  3 2 1 0

データb

13 12 11 10 9 8 7 6 5 4  3 2 1 0

ですから、
  Dim max As Integer
  max = asz
  If bsz > max Then max = bsz
で取得されるmaxは8ということになります。




第2話へ 第4話へ

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++ 入門 基礎から応用まで
本サイトトップへ