第25講 n進数の演算---その1 加法
第7話 プログラム解説その1

プログラム主要部分再掲
int g(int* a,int* b,int* c,int n){
   int i,j,k,d[10000],e[10000];
   for(i=0;;i++){
     if(a[i]==n){
        j=i;
        break;
     }
   }
   for(i=0;;i++){
     if(b[i]==n){
        k=i;
        break;
     }
   }
   if(j>=k){
     for(i=0;i<=j+2;i++){
        c[i]=0;
        d[i]=0;
        e[i]=0;
     }
     for(i=0;i<j;i++)d[i]=a[i];
     for(i=0;i<k;i++)e[i]=b[i];
     for(i=0;i<j;i++){
        c[i]+=(d[i]+e[i]);
        c[i+1]+=c[i]/n;
        c[i]=c[i]%n;
     }
     for(i=j+2;;i--){
        if(c[i]>0){
           c[i+1]=n;
           return(i+1);
        }
     }
   }
   else{
     for(i=0;i<=k+2;i++){
        c[i]=0;
        d[i]=0;
        e[i]=0;
     }
     for(i=0;i<k;i++)d[i]=b[i];
     for(i=0;i<j;i++)e[i]=a[i];
     for(i=0;i<k;i++){
        c[i]+=(d[i]+e[i]);
        c[i+1]+=c[i]/n;
        c[i]=c[i]%n;
     }
     for(i=k+2;;i--){
        if(c[i]>0){
          c[i+1]=n;
          return(i+1);
        }
     }
   }
}

プログラム解説
   for(i=0;;i++){
     if(a[i]==n){
        j=i;
        break;
     }
   }
   for(i=0;;i++){
     if(b[i]==n){
        k=i;
        break;
     }
   }
では、終わりの印nを探索しています。
   if(j>=k){
     ・・・
   }
   else{
     ・・・
   }
となっているのは、a[i]とb[i]の桁数がどちらが大きいのか、
で場合分けをしています。
すなわち、
a[i]≧b[i]

a[i]<b[i]
のそれぞれの場合で処理をしています。
a[i]の桁数がb[i]の桁数以上の場合には、
   if(j>=k){
     for(i=0;i<=j+2;i++){
        c[i]=0;
        d[i]=0;
        e[i]=0;
     }
初期化は、a[i]の桁数であるjまでで十分ですが、
念のため少し大きめに初期化をしています。
足し算で、桁数が増える可能性を考えているわけです。
といっても足し算で二桁増える可能性はないので、
   if(j>=k){
     for(i=0;i<=j+1;i++){
        c[i]=0;
        d[i]=0;
        e[i]=0;
     }


   if(j>=k){
     for(i=0;i<=j;i++){
        c[i]=0;
        d[i]=0;
        e[i]=0;
     }
でも十分だとは思われますが、
まさに念のためです。
次の行の
     for(i=0;i<j;i++)d[i]=a[i];
     for(i=0;i<k;i++)e[i]=b[i];
は大きい方をd[i]に、
小さい方をe[i]に代入しています。
5進数で例えば、
a[i]とb[i]がそれぞれ、
54023
 5214
すなわち、
a[0]=3,a[1]=2,a[2]=0,a[3]=4,a[4]=5
b[0]=4,b[1]=1,b[2]=2,b[3]=5
(逆順になっていることに注意してください。)
であったとしますと、d[i]とe[i]はそれぞれ
04023
00214
すなわち、
d[0]=3,d[1]=2,d[2]=0,d[3]=4,d[4]=0
e[0]=4,e[1]=1,e[2]=2,e[3]=0,e[4]=0
となります。これであれば、
c
となって上手く計算できます。
もしこれが、
54023
 5214
のままであったとすると、
x

とおかしなことになってしまいます。
終わりの記号n(この例だと5)は、
表示のときには便利ですが、
四則演算(加減乗除)するときには、
邪魔をするのです。
なので、一端その終わり記号nを外す作業が必要になります。


第6話へ 第8話へ

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