第18講 n進数演算−−−加法
第9話 足し算マクロ解説その3
03154
を実現するプログラム主要部分再掲
Sub s(a() As Integer, b() As Integer, c() As Integer, n As Integer)
  
  Dim i As Integer, ik1 As Integer, ik2 As Integer, mx As Integer
  
  i = 0
  Do While 1
    If a(i) = n Then
      a(i) = 0
      ik1 = i
      Exit Do
    Ena If
    i = i + 1
  Loop
  i = 0
  Do While 1
    If b(i) = n Then
      b(i) = 0
      ik2 = i
      Exit Do
    Ena If
    i = i + 1
  Loop
  mx = ik1
  If mx < ik2 Then mx = ik2
  For i = 0 To mx - 1
    c(i) = c(i) + a(i) + b(i)
    c(i + 1) = c(i + 1) + Int(c(i) / n)
    c(i) = c(i) Mod n
  Next
  If c(mx) = 0 Then
    c(mx) = n
  Else
    c(mx + 1) = n
  Ena If

  For i = 0 To mx
    If c(i) < n Then Cells(6, 1 + mx - i) = c(i)
  Next
  a(ik1) = n
  b(ik2) = n

Ena Sub
参考ダウンロード添付ファイル

いよいよ核心部分
  For i = 0 To mx - 1
    c(i) = c(i) + a(i) + b(i)
    c(i + 1) = c(i + 1) + Int(c(i) / n)
    c(i) = c(i) Mod n
  Next
の解説です。
私もここは、かなり考えました。
「Eclipse C++入門講義」や「excel 2013 2010 2007 vba 入門」などで、
何回も組んだ体験があるのにもかかわらず、
最初はうっかり
  For i = 0 To mx - 1
    If i>0 Then
      c(i) = (a(i) + b(i) + c(i-1)) Mod n
      c(i+1) = Int((a(i) + b(i)+ c(i-1))/n)
    Else
      c(i) = (a(i) + b(i)) Mod n
      c(i+1) = Int((a(i) + b(i))/n)
    End If      
  Next
としてしまいました。
参考ダウンロード添付ファイル
ですが、これだと、
0328
となって上手くいきません。
なぜ、上手くいかないのでしょうか。
a(0)=3,a(1)=3,a(2)=1,a(3)=1,a(4)=4,a(5)=0,a(6)=4,a(7)=4,a(8)=0
b(0)=0,b(1)=2,b(2)=5,b(3)=4,b(4)=2,b(5)=5,b(6)=5,b(7)=5,b(8)=0
トレースしてみましょう。
i = 0 のとき、
    Else
      c(i) = (a(i) + b(i)) Mod n
      c(i+1) = Int((a(i) + b(i))/n)
が実行されて、
      c(0) = (a(0) + b(0)) Mod 6
      c(0+1) = Int((a(0) + b(0))/n)
から、
      c(0) = (3 + 0) Mod 6
      c(0+1) = Int((3+ 0)/6)
すなわち
      c(0) = 3
      c(1) = 0
0328
というわけで、正しく計算できています。
i = 1 のとき、
    If i>0 Then
      c(i) = (a(i) + b(i) + c(i-1)) Mod n
      c(i+1) = Int((a(i) + b(i)+ c(i-1))/n)
が実行されて、
      c(1) = (a(1) + b(1) + c(1-1)) Mod n
      c(1+1) = Int((a(1) + b(1) + c(1-1))/n)
から、
      c(1) = (3 + 2 + 3) Mod 6
      c(2) = Int((3 + 2 + 3)/6)
すなわち
      c(1) = 2
      c(2) = 1
0328
というわけで、この段階で間違いが分かります。
3+2で繰り上がりは発生しないのに、
c(2) = 1と1繰り上がったことになっています。
原因は、
    If i>0 Then
      c(i) = (a(i) + b(i) + c(
i-1)) Mod n
      c(i+1) = Int((a(i) + b(i) + c(i-1))/n)
ピンクにあることが分かります。
でしたら、
  For i = 0 To mx - 1
    If i > 0 Then
      c(i) = (a(i) + b(i) + c(i)) Mod n
      c(i + 1) = Int(c(i) / n)
    Else
      c(i) = (a(i) + b(i)) Mod n
      c(i + 1) = Int((a(i) + b(i)) / n)
    End If
  Next
と変更したら上手くいくでしょうか。
i = 1 のとき、
    If i>0 Then
      c(i) = (a(i) + b(i) + c(i)) Mod n
      c(i + 1) = Int(c(i) / n)
が実行されて、
      c(1) = (a(1) + b(1) + c(1)) Mod 6
      c(1+1) = Int(c(1) / 6)
から、
      c(1) = (3 + 2 + 0) Mod 6
      c(2) = Int(5/6)
すなわち
      c(1) = 5
      c(2) = 0
03699
今回は上手くいっています。
i = 2 のとき、
    If i>0 Then
      c(i) = (a(i) + b(i) + c(i)) Mod n
      c(i + 1) = Int(c(i) / n)
が実行されて、
      c(2) = (a(2) + b(2) + c(2)) Mod 6
      c(2+1) = Int(c(2) / 6)
から、
      c(1) = (1 + 5 + 0) Mod 6
      c(2) = Int(0/6)
すなわち
      c(1) = 0
      c(2) = 0
03699
残念ながら、繰り上がりに失敗しています。





第8話へ 第10話へ
004

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入門へ
本サイトトップへ