プロが教えるわが家の防犯対策術!

C言語の勉強をしている者です。
現在、Cを使って簡易電卓を作ろうと取り組んでいる最中なのですが、
テキストの中で乗算と除算を「*」、「/」を使わずに表現しろとの記載がありました。
乗算はループで加算を繰り返すことで理解できているのですが、除算の方法について浮かびません。
どうぞ知恵をお貸しください。

A 回答 (6件)

因みに乗算はというと。



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。

やっている事は割り算の逆。というか、上記の逆をやれば割り算になる。
    • good
    • 0

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。
    • good
    • 0

> 乗算はループで加算を繰り返すことで理解できているのですが、



ということは整数ですね。

> 除算の方法について浮かびません。

/演算子を使わなければよいのであれば、div関数を使えば済むことです。
    • good
    • 0

>一般的には遅いので実用的ではありません。



速いか遅いかがわかるほどの回数だけ引き算するのでなければ、
#1さんの方法でじゅうぶん実用的かと思います。
    • good
    • 0

ANo.1に記載された方法でも計算できなくはないですが、一般的には遅いので実用的ではありません。


普通は人間が筆算でやるのと同じく桁を合わせながら引き算を繰り返します。ただし二進数でやります。
下記URLにアルゴリズムの解説があります。
http://www.elc.ees.saitama-u.ac.jp/ITO/Ex4/divid …

参考URL:http://www.elc.ees.saitama-u.ac.jp/ITO/Ex4/divid …
    • good
    • 0

被除数から除数を引き算し、結果が0以上の間は繰り返す。


繰り返した回数が求める答えです。
例 7/3=2ですが
1回目 7-3=4
2回目 4-3=1
3回目 1-3(引けない)
よって、2回繰り返したので、答えは2、余り1
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!