- 締切済み
加算と減算で乗算と除算を表現したい
C言語の勉強をしている者です。 現在、Cを使って簡易電卓を作ろうと取り組んでいる最中なのですが、 テキストの中で乗算と除算を「*」、「/」を使わずに表現しろとの記載がありました。 乗算はループで加算を繰り返すことで理解できているのですが、除算の方法について浮かびません。 どうぞ知恵をお貸しください。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- chie65536
- ベストアンサー率41% (2512/6032)
因みに乗算はというと。 671に421をかける。 積を0にする。 421が奇数なので、積に671を足す。0+671=671。 421を1ビット右シフトして210にする。 671を1ビット左シフトして、1342にする。 210が偶数なので、何もしない。 210を1ビット右シフトして105にする。 1342を1ビット左シフトして、2684にする。 105が奇数なので、積に2684を足す。671+2684=3355。 105を1ビット右シフトして52にする。 2684を1ビット左シフトして、5368にする。 52が偶数なので、何もしない。 52を1ビット右シフトして26にする。 5368を1ビット左シフトして、10736にする。 26が偶数なので、何もしない。 26を1ビット右シフトして13にする。 10736を1ビット左シフトして、21472にする。 13が奇数なので、積に21472を足す。3355+21742=24827。 13を1ビット右シフトして6にする。 21472を1ビット左シフトして、42944にする。 6が偶数なので、何もしない。 42944を1ビット左シフトして、85888にする。 6を1ビット右シフトして3にする。 3が奇数なので、積に85888を足す。24827+85888=110715。 3を1ビット右シフトして1にする。 85888を1ビット左シフトして、171776にする。 1が奇数なので、積に171776を足す。110715+171776=282491。 1を1ビット右シフトして0にする。0になったので終り。 答え;282491。 やっている事は割り算の逆。というか、上記の逆をやれば割り算になる。
- chie65536
- ベストアンサー率41% (2512/6032)
5138を253で割る場合。 5138を超えない範囲で、253を左シフトしていく。 506⇒1012⇒2024⇒4048まで4回シフト可能。 1を4回左シフトした16を作り、商にする。 5138-4048を求める。1090。 1090を超えない範囲で、253を左シフトしていく。 506⇒1012まで2回シフト可能。 1を2回左シフトした4を作り、商に足す。16+4=20。 1090-1012を求める。78。 78は253より小さいので、これが余り。 答え:商20、余り78。
- jacta
- ベストアンサー率26% (845/3158)
> 乗算はループで加算を繰り返すことで理解できているのですが、 ということは整数ですね。 > 除算の方法について浮かびません。 /演算子を使わなければよいのであれば、div関数を使えば済むことです。
- asuncion
- ベストアンサー率33% (2127/6290)
>一般的には遅いので実用的ではありません。 速いか遅いかがわかるほどの回数だけ引き算するのでなければ、 #1さんの方法でじゅうぶん実用的かと思います。
- rinkun
- ベストアンサー率44% (706/1571)
ANo.1に記載された方法でも計算できなくはないですが、一般的には遅いので実用的ではありません。 普通は人間が筆算でやるのと同じく桁を合わせながら引き算を繰り返します。ただし二進数でやります。 下記URLにアルゴリズムの解説があります。 http://www.elc.ees.saitama-u.ac.jp/ITO/Ex4/divide.html
- tatsu99
- ベストアンサー率52% (391/751)
被除数から除数を引き算し、結果が0以上の間は繰り返す。 繰り返した回数が求める答えです。 例 7/3=2ですが 1回目 7-3=4 2回目 4-3=1 3回目 1-3(引けない) よって、2回繰り返したので、答えは2、余り1