第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進数の演算は、数独の自動生成の後に再開します。



第10話へ 第27講第1話へ

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