• 締切済み

加算と減算で乗算と除算を表現したい

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

みんなの回答

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.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。 やっている事は割り算の逆。というか、上記の逆をやれば割り算になる。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.5

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)
回答No.4

> 乗算はループで加算を繰り返すことで理解できているのですが、 ということは整数ですね。 > 除算の方法について浮かびません。 /演算子を使わなければよいのであれば、div関数を使えば済むことです。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

>一般的には遅いので実用的ではありません。 速いか遅いかがわかるほどの回数だけ引き算するのでなければ、 #1さんの方法でじゅうぶん実用的かと思います。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

ANo.1に記載された方法でも計算できなくはないですが、一般的には遅いので実用的ではありません。 普通は人間が筆算でやるのと同じく桁を合わせながら引き算を繰り返します。ただし二進数でやります。 下記URLにアルゴリズムの解説があります。 http://www.elc.ees.saitama-u.ac.jp/ITO/Ex4/divide.html

参考URL:
http://www.elc.ees.saitama-u.ac.jp/ITO/Ex4/divide.html
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

被除数から除数を引き算し、結果が0以上の間は繰り返す。 繰り返した回数が求める答えです。 例 7/3=2ですが 1回目 7-3=4 2回目 4-3=1 3回目 1-3(引けない) よって、2回繰り返したので、答えは2、余り1

関連するQ&A

  • 加算、減算、乗算、除算について

    // 加算、減算、乗算、除算について // 記号と数値にそれぞれ別の配列に分けました。 // そこから、どうすれば計算ができるのか // 悩んでいます。よろしくお願いします。 #include<iostream> using namespace std; char **tokei(char *str1,char *str2,int *count,char *kigouX); int main() { int count; int *num; char **www; char kigo[12]; char str1[30],str2[]="+-*/"; strcpy(str1,"123+45-6*789/"); www=tokei(str1,str2,&count,kigo); num=new int[count]; for(int n=0;n<count;n++) { num[n]=atoi(www[n]); } // 数値に変換num[]、記号を順番に抽出kigo[] -->OK // 記号に沿って、数値を演算すればよい。 // ここがやり方(理屈)がわからない。 getchar();{}return 0; } char **tokei(char *str1,char *str2,int *count,char *kigouX) { int cnt=0; int m=0; for(int a=0;*(str1+a)!='\0';a++){} for(int b=0;*(str2+b)!='\0';b++){} for(int i=0;i<a;i++) { for(int j=0;j<b;j++) { if(*(str1+i)==*(str2+j)) { *(kigouX+m)=*(str1+i);m++; *(str1+i)='\0'; cnt++; } } } *(kigouX+m)='\0'; char **c; c=new char*[cnt]; *count=cnt; for(int m=0;m<cnt;m++) { c[m]=str1; while(*str1!='\0'){str1++;}str1++; } return c; }

  • 除算を使わずに10で割りたい。

    加算、減算、シフト、論理演算、ループ、等を使って 除算を使わずに10で割る方法は無いものでしょうか? また、近似値を求めてから誤差を修正する方法でも構いません。 ただし、ループで10を引き続けてカウントする方法は除外させてください。 言語はCでお願いします。

  • 乗算記号は何故 "*" ??

    私の知っている限りの言語(C, C++, Java, COBOL)でも、全て乗算に"*"、除算に"/"を使ってますが、算数ではそれぞれ「×」「÷」ですよね。 これには何か理由があったのでしょうか? "/"は分数にも使われる(記述が逆ですが)のでまだ分かるのですが、数学の知識が浅いせいもあってか、"*"と乗算を結びつけるものが思いつかず、不思議に思ってました。 本当に単純な疑問なので、暇なときにでも回答くださいませ。

  • 2進数の乗算と除算

    先日、桁上がりについて質問させていただいた者です。 加算と減算はなんとか完成したのですが、乗算と除算になって混乱してしまいました。 二進数の乗算、除算はビットシフトと関係がありますが、私の作っているものの場合はどのようなソースコードにすればよいでしょうか? (ちなみに、bの値は2のべき乗に限定しています。) int main(void) { int a,b,i; int x[8],y[8]; puts("二つの符号なし整数を入力してください。(ただしa>bとし、bは2のべき乗の値とする)"); printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b);  printf("\n"); /*二進数の形に変換*/ for(i=0;i<=7;i++){ x[i]=a%2; a=a/2; y[i]=b%2; b=b/2; } puts("aとbをそれぞれ二進数で表すと"); printf("a="); for(i=7;i>=0;i--){ printf("%d",x[i]); } puts(""); printf("b="); for(i=7;i>=0;i--){ printf("%d",y[i]); } printf("となります。\n\n");     return(0);  }

  • 配列128桁の加算、減算について。

    現在C言語で四則演算について勉強しています。 128桁の配列をもつ整数についてa,b,各桁を加算、減算するプログラムを書きたいのですが分からなくて困ってます。できればCのソースを教えて欲しいですおねがいします。  s = 65536 a[128],b[128],c[128]   i = -1 とする。  i <128 である限り、演算を実行。 i >127なら終わり。(++1) c(i) = a(i) - b(i)という演算を行う。 c(i) < 0 の場合 s を借りてくる。 c(i)に s を加算し、上の桁から1を引く。  

  • [2進数 シフト演算 除算について]

    [2進数 シフト演算 除算について] シフト演算について勉強中です。ご協力お願い出来たら幸いです。 乗算について例えば『1010』(符号ビットを考えず)を2倍 4倍 8倍(2のn乗)した場合 ビットを2倍であれば1つ、4倍であれば2つ・・・左に シフトすれば良いというのは理解しました。 また3倍 5倍などのケースも、 3倍であれば1ケタ左にシフトした数+1010で求まる事も理解しました。 問題は除算です。他の質問を探ってみたのですが、考え方は一緒という回答で・・・詰まっています 除算は右シフトとの事ですが 先ほどの例である『1010』(10)ですがこれを1/2、つまり2で割ると 1つ右にシフトし1010→0101 となり 1010を1/4する場合右に2ビットシフトし 1010→0010.10 となり理解は出来ます。 しかし1/3 、1/5といった場合の計算の仕方が分かりません。 余りを出さないという考えで(近似値になると思いますが) 解き方をご教授願えたらと思います。

  • 電卓検定試験。

    夏に少しだけ電卓の勉強をして、 あさって電卓検定試験の2・3級を受ける予定です。 今日になっていよいよ復習してみようとしたのですが、 すっかりやり方を忘れてしまっていて、手がつけれません・・・。 複合算・乗算・除算、どうやってやるものだったか どうしても思い出せません。 現在試験を受けるのが怖くてパニックです。 ご存じの方、すみません。 解き方を教えてください・・・。

  • さまざまな加算器と減算器と乗算器について

    最近、論理回路の実験の授業で加算器・減算器・乗算器に取り組みました。 加算器については、半加算器と全加算器の機能や作り方がわかりますが、 Q1.なぜ二つの半加算器で全加算器が作られるのか、その理由が少し推測をしましたが、やはりはっきりとわかりません。 あと、何bitやら何bitやらの並列全加算器についてもよくわかりません。これは本間にレジュメを読みながらしないと、なかなか回路が作れません。 Q2.bitって何ですか?加算器の個数を示しているのか、それとも出力とか入力とかの個数を示していますか。 それから、減算器も全然原理がわかりません。 Q3.結果が1の補数か2の補数かはどのように決められていますか? 文がちょっと長くて失礼ですが教えていただければ感謝いたします!

  • 関数電卓の複素数計算のやり方

    写真の関数電卓で例のような、 複素数(直交座標形式)の乗算、除算をしたいのですが、 やり方が分かりません。 例) ・(a+bi)×(c+di)=x+yi ・(a+bi)/(c+di)=x+yi このような計算を写真の関数電卓でするには どうしたらいいのでしょうか?? 回答よろしくお願いします。 ちなみに写真の関数電卓は、 SHRAPのEL-509Eです。

  • 全経電卓検定の問題内容について

    就職活動中で今度事務を受けることにしたのですが 全経の電卓検定の勉強をしたらいいと過去の報告書に書いてありました ですが、全経の電卓検定の問題集は売れ切れが多くなかなか手に入りません いつ受験になるかわからないのでとても焦っています HPで乗算、除算、見取算、複合算、伝票算の5種目について出題されます と書かれていたのでそれはわかったのですが、見取算、複合算、伝票算などはどのようなことをするのでしょうか? 今度の休日を使って本屋で問題集を探して買う予定ですがどうしても気になるので教えてください

専門家に質問してみよう