第26講 n進数の演算---その2 減法
第11話 プログラム解説その5
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);
の任務は、もちろん終わりの印nの刻印です。
場合分けになっている理由は、a-bにおいて、
どちらが大きいのかによって、
答が正の数の場合と負の数の場合に分かれます。
答が正の数の場合には、03258の0のところにnを入れて、
n3258
とすればよいのです。
左(i=g-1)から始めて、
始めて0以外の数が出てきた1つ手前にnを刻印します。
for文になっている理由は
12228-12222のような場合には
00006となるからです。
6の1つ手前にnを印字して
000n6です。表示のときは、右側から順に示していきますので、
左3つの0は無視されます。
理由は、表示のfor文がnがあるときに強制的に抜けるようになっていたからです。
さて、問題は計算結果が負になる場合です。
325(7)-436(7)の計算は、実際には
436(7)-325(7)とけいさんされ
111となってしまいますが、
正しくは、-111です。
そこで、
else{
c[i+2]=n;
c[i+1]=n+1;
ik=i+2;
}
では
(n)(n+1)111
として、n+1に-の意味を持たせているのです。
何を何の意味に使うかは、
プログラマーが自由に決めてよいものです。
ただし、1度意味を決めたら、
プログラムの全体で同じ統一しないとおかしなことになります。
表示関数が
void h(int* x,int n){
int i,j;
for(i=0;;i++){ //終わりの添え字の入っている添え字の取得
if(x[i]==n){
j=i;
break;
}
}
for(i=j-1;i>=0;i--){
if(x[i]<n)cout<<x[i];
if(x[i]==n+1)cout<<"-";
}
cout<<endl;
}
と訂正されていたことのお気づきでしたでしょうか。
(n)(n+1)111
(n+1)が-に訂正されて、
-111
とコンソールに示されるわけです。
さて、予定では次はn進数の演算---かけ算
に進むことになっていましたが、
第27講では、
第24講 特殊種法で魔方陣を超高速に自動生成する
を受けて、数独自動生成に取り組むことにします。
今回の自動生成は、解答の自動生成ですが、
将来的には、問題自動生成に取り組みます。
n進数の演算は、数独の自動生成の後に再開します。