第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];
は
上のように、引かれる数字の方が、引く数字より大きい場合に、
実行される内容です。
この場合は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];
}
では何をしているのでしょうか。
否定されるのは上の例のような場合です。
つまり、引かれる数の方が引く数より小さい場合です。
0-4は、正の数の範囲では計算できません。
このときは、上の位から1つ借りてきて、
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];
}
のような複雑な形をしているのでしょうか。
皆さん、粘り強く考えましょう。
まさに、減法の核心部分です。