2022/6/28


筆算 知ってるよね?

筆算だよね?

ここまではいいかな?
つづきをいくよ



桁上がりがあると計算が複雑になるね
箱が増えたね? こんな箱 知っているよね?
桁上がりがあるかないかで計算方法を分けたほうがよさそうだね こんな感じかな?
「桁上がり」がわかった君、これからは「桁上がり」のことを「きゃりー」と呼ぼう

t = (箱aの一の位) + (箱bの一の位)
(箱cの一の位) = ....
if(t>10){ ...十の位の箱を作る...十の位に値を入れる
} else {...
}

もう少しみてみよう



2桁の計算になったね
さいしょは一の位を計算だね つぎに十の位の計算だね
箱bが存在している間、1桁づつ計算すればいいわけだね



また箱が増えたね 桁上がりがあると計算が複雑になるね
十の位は一の位からの桁上がりも足さないとね
きっと百の位とか千の位も同じだね

/* tは修正が必要だ */
t = (箱aの十の位) + (箱bの十の位) + (一の位からの桁上がり)
(箱cの十の位) = ....
if(t>10){...桁上がり処理
} else {...
}


桁上がりがある=箱を作る と思った君 ちょっと違うよ
現実はもう少し複雑になるね 
桁上がりは最上位で発生するとは限らない。桁上がりは途中の桁でも発生する。
最上位の計算でキャリーが発生した場合だけ「箱cを増設」になるわけだ。
キャリーと箱をつくる条件を整理すると もうすこしマシになるだろうね--各自検討してみよう

/* 箱a,b全体を考えると */
while(箱bは続いている間 または キャリーがある){
 t = (箱aのある位) + (箱bのある位) + (下位からのキャリー)
 (箱cのある位) = ....
 if(t>10){...桁上がり処理
  if(箱cがたりない){...箱cを増設, 増設した箱に値を入れる
   } else { ...箱cはある 箱c1つ上の桁を指定}
 } else {...桁上がりがなかったので
   /* 各自考えよう */
 }
}

そろそろ飽きてきたので、一気にはなしをするよ。
以上のことをn回繰り返すので while(n-->1){...}みたいな構造で囲む。while文がキライならfor文でもいい。
計算結果は一の位から上位にリンクしている。
計算結果は上位から表示したいので、計算結果をすべてスタックにpushしてから、popすると上位→下位の並びになる。
計算結果を表示して
メモリを開放する---これ重要 メモリの掃除を忘れると「メモリリーク」が発生するからね
これで全体のプログラムが完成するはずだ。

箱a,b,c,stack他を宣言
箱aを初期化 (初期値1)
箱bを初期化 (初期値1)
箱cを初期化 (初期値はなにでもよい すぐに上書きする)
while(n-->1){
  箱aは一の位を指定   箱bは一の位を指定   箱cは一の位を指定  キャリーはなし

  while(箱bは続いている間 または キャリーがある){
   t = (箱aのある位) + (箱bのある位) + (下位からのキャリー)
   (箱cのある位) = ....
    if(..){
     } else {
    }
   上の桁の計算を準備
  }
 すべての桁について計算が終わったので箱a,b,cを入れ替える
  箱bを箱aに (箱bの中身を箱aにコピーかもしれない もっといい方法があるかもしれない)
  箱cを箱bに (箱cの中身を箱bにコピーかもしれない もっといい方法があるかもしれない)
  箱aを箱cに (箱aを捨てて新しく箱cをつくるかもしれない もっといい方法があるかもしれない)
}

/*答えは箱xにあるので*/
  箱x一の位を指定
  while(箱bが続く限り){
    箱xの中身をstackにpushして
  }
 whle(stackが続く限り){
    stackから値をpopして表示
  }
/*計算が終わったのでお片付け*/
  stackを開放 箱aを開放 箱bを開放 箱cを開放
  return 0;/*正常終了*/
}
ほぼ答えみたいなものを示したわけだが、それでもまだできないという君
いろいろマズイのではないかな?

==お嬢様 困っている学生に救いの手を==

     
お嬢様にお願いしてみませんか?