第26講 n進数の演算---その2 減法
第8話 プログラム解説その2
プログラム主要部分再掲
int hk(int*a,int*b,int* c,int n,int g,int u){
   int i,j,k,d[10000],e[10000],h;
   for(i=0;i<=g+1;i++){
     c[i]=0;
     d[i]=0;
     e[i]=0;
   }
   if(u>0){
     h=1;
     for(i=0;i<g;i++){
        d[i]=a[i];
        if(b[i]==n)h=0;
        if(h==1)e[i]=b[i];
     }
   }
   else{
     h=1;
     for(i=0;i<g;i++){
        d[i]=b[i];
        if(a[i]==n)h=0;
        if(h==1)e[i]=a[i];
     }
   }
   for(i=0;i<=g;i++){
     if(d[i]>=e[i]){
        c[i]=d[i]-e[i];
     }
     else{
        for(j=i+1;j<g;j++){
            if(d[j]>0){
              d[j]--;
              break;
           }
           else{
             d[j]=n-1;
           }
        }
        c[i]=n+d[i]-e[i];
     }
   }

   int ik;
   for(i=g-1;i>=0;i--){
     if(c[i]>0){
        if(u>0){
          c[i+1]=n;
          ik=i+1;
        }
        else{
           c[i+2]=n;
           c[i+1]=n+1;
           ik=i+2;
        }
        break;
     }
   }
   return(ik);
}

解説の続き
今回は色のついている部分
   for(i=0;i<=g;i++){
     if(d[i]>=e[i]){
        c[i]=d[i]-e[i];
     }
     else{
        for(j=i+1;j<g;j++){
            if(d[j]>0){
              d[j]--;
              break;
           }
           else{
             d[j]=n-1;
           }
        }
        c[i]=n+d[i]-e[i];
     }
   }

について解説します。
この部分こそ引き算実行関数のエンジンともいうべきものです。
③ 430213(5)-34201(5)
を例に説明しましょう。
     if(d[i]>=e[i]){
        c[i]=d[i]-e[i];
     }


        c[i]=d[i]-e[i];

p

上のように、引かれる数字の方が、引く数字より大きい場合に、
実行される内容です。
この場合は3-1の計算結果がc[0]に入ります。
では、if文の条件が否定された場合に実行される
     else{
        for(j=i+1;j<g;j++){
            if(d[j]>0){
              d[j]--;
              break;
           }
           else{
             d[j]=n-1;
           }
        }
        c[i]=n+d[i]-e[i];
     }

では何をしているのでしょうか。
u
否定されるのは上の例のような場合です。
つまり、引かれる数の方が引く数より小さい場合です。
0-4は、正の数の範囲では計算できません。
このときは、上の位から1つ借りてきて、
y
5-4=1が実行されます。
今の例では、5進数ですから10
(5)=5(10)ですよね。
ですから、5-4となるのです。
でもこれなら、
     else{
        d[i+1]--;
        c[i]=n+d[i]-e[i];
     }

で十分なのではないでしょうか。
どうして、
     else{
        for(j=i+1;j<g;j++){
            if(d[j]>0){
              d[j]--;
              break;
           }
           else{
             d[j]=n-1;
           }
        }
        c[i]=n+d[i]-e[i];
     }

のような複雑な形をしているのでしょうか。
皆さん、粘り強く考えましょう。
まさに、減法の核心部分です。







第7話へ 第9話へ

a

eclipse c++ 入門講義第1部へ

eclipse c++ 入門講義第2部へ


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