質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

5回答

2950閲覧

演算子を使わない掛算

kimuchiiii

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/07/18 14:34

c++言語の質問です。演算子*を使わずに2個の整数同士の掛け算を出力する方法が分かりません。どなたか教えてくださるとありがたいです。よろしくお願いいたします、

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/07/18 14:37

c++ のご質問でしたら、タグを c では無く c++ にしてください。
guest

回答5

0

真面目に回答しておきましょう

あなたが、XXX * YYY という問題を出されたとき、筆算でどうやってそれを解くでしょうか。
まさか3桁どおしの掛け算ができないとは言いませんよね?
その方法をそのとおりに、コードにしていけばいいのです

投稿2021/07/18 14:50

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2021/07/18 14:54

ひと桁どおしの掛け算に演算子*を使わない方法を説明しないと回答にならない。低評価。
y_waiwai

2021/07/18 15:04

まさに、この問題のキモはそこにあります 10進数の掛け算をする場合には、*は必要なのかもしれません(あえて、九九のテーブルを使用するなどということは想定しないでおきます) さて、これを、2進数の掛け算を記述する場合とすると、*は必要とするんでしょうか
episteme

2021/07/18 15:12

べつに何進数であろうが加算で代替できる。
y_waiwai

2021/07/18 15:13

それがすべてですよw
episteme

2021/07/18 15:20 編集

筆算するとき、加算を何度も繰り返すんですか?
y_waiwai

2021/07/18 15:19

そうしてもかまいませんけどねーw
episteme

2021/07/18 15:21

筆算を例えに出した意味がないんじゃ?
kairi003

2021/07/18 22:12

ビットで筆算みたいに考えれば計算量がO(N)からO(log(N))まで落ちるのでそういう話じゃないですか?
kairi003

2021/07/18 22:21 編集

「乗算演算子を使わない乗算の実装」の課題をやる人がビット演算を求めているのかはさておき…
Zuishin

2021/07/18 22:22

落ちますか?
kairi003

2021/07/18 22:30 編集

A*Bとして、Bのビットを見て1の桁は桁数分Aを左シフトして足しこむ、みたいな実装すれば、Bを2進数解釈する→最大log_2(B)回のループで済むと思ったのですが
Zuishin

2021/07/18 23:00

なるほど 10 倍するのであれば 4 回ずつ(合わせて 8 回)シフトして 2 倍と 8 倍の二回加算すればいいということですね? 整数としか書いていないので非常に大きな桁の演算に対応するということですか。 一つの方法ではあると思いますが、大喜利なら回答者が自分でコードを書かないと。
kairi003

2021/07/18 23:11 編集

回答者が筆算を例に上げており,2進数の掛け算がどうこういってるのでこんな意図かなと考えた次第です. 不親切で迂遠ですが,質問は明らかに課題っぽいし,そこまで外れた回答でもないと思ったのでここまで低評価がつくのはちょっと可愛そうかなぁと.
y_waiwai

2021/07/18 23:14

まあしかし、加算とシフトで乗算を構成するってのはある意味常識みたいなもんだと思ってましたが、そーでもないんですね
kairi003

2021/07/18 23:17

それを常識として認識している人はこの質問しないと思います... 私はy_waiwaiさんの回答は別解として良いと思いますが,初等な教科書なら発展枠で書かれそうだと思いました
kairi003

2021/07/18 23:21

低評価する人たちという意味ならまぁ,そうですね
Zuishin

2021/07/18 23:23 編集

競技プログラミングなどで多倍長演算するなら普通にやりますが、初心者の課題で「真面目な回答」とあらかじめ言った上でコードもなしに回答する人は他にいないでしょうね。
episteme

2021/07/19 07:55 編集

多桁の筆算に使われるのは 「シフト と 加算 」 じゃない。 「N進数のN倍 と 加算」です。 N=2 のとき(所謂)左シフトと同義になるだけ。
guest

0

0 + x + x + x + .... のように、0 に x を y 回足せば x*y が求まります。

投稿2021/07/18 14:37

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2021/07/18 14:40

ベツトアンサー貰えるとは思わなんだwww 何かよっぽど難しく考えてたんでしょか?
episteme

2021/07/18 23:47

おや、BA外れた...
kimuchiiii

2021/07/19 00:29

使い方がわからず、間違えてタップしていたようです^^;すみません。 ご回答ありがとうございました。
guest

0

ベストアンサー

c++言語の質問です。演算子*を使わずに2個の整数同士の掛け算を出力する方法が分かりません。

次のコードを C++ に書き直してみてください。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int a, b, c = 0; 6 if (scanf("%d%d", &a, &b) != 2) return 1; 7 for (int i = 0; i < 32; i++) 8 if (b >> i & 1) c += a << i; 9 printf("%d\n", c); 10}

オーバーフローは考慮していません。

追記
別解

C

1 for (; a; a <<= 1, b >>= 1) 2 if (b & 1) c += a;

追記2
ビット演算を使わないコードです。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int a, b, c = 0; 6 if (scanf("%d%d", &a, &b) != 2) return 1; 7 for (; a; a += a) { 8 if (b % 2) c += a; 9 if (b < 0) b--; 10 b /= 2; 11 } 12 printf("%d\n", c); 13}

投稿2021/07/19 00:17

編集2021/07/19 06:34
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kimuchiiii

2021/07/19 12:36

解決できました!丁寧にありがとうございました!
kazuma-s

2021/07/19 14:29

どのやり方で解決したのですか? 丁寧ではありません。コードを提示しただけで何の説明もしていません。 意味を理解するのはあなたです。 どうしても理解できないのであれば、どこが分からないかを質問してください。
guest

0

まず、私の過去回答を参考にしてください。

質問者さんはプログラミングとかを置いといて、『現実世界でならどうするか』を考えたとき、どうしますか?

つまり、算数とかの問題で、『掛け算を使わずに、掛け算(と同等のこと)をせよ』
みたいな感じでしょうか。

例えば3×5を掛け算を使わずに計算する感じです。

掛け算は『足し算を簡略化したもの』ですから、

3×5は『3を5回足したもの』と考えることができますね。

つまり、

3+3+3+3+3

ですね。

これを計算するとき、どうしますか?

私は計算が苦手なので、一つずつやります。

まず3+3をする。6ですね。
この6をノートかなんかに書いておく。
これを記録Xとする。

次に記録Xに+3する。
つまり、6+3=9ですね。
そのまま記録Xを更新する。
(6から9に)

そのまま記録Xに+3する。
9+3=12なので、記録Xを12に更新する。

…とやっていくと、最終的に記録Xが3×5の答えになりますね。

で、最初の3+3以外は常に

記録X = 記録X + <数字>

となっていますね。

でも、最初の3も、

記録X=0

と考えると、0+3=3なので、この規則性は完全に満たします。

これをC++ならC++の書き方で書き下せば良いだけです。

ノートに書いた記録Xは、C++だとノートには書けないので、『変数』で代用。

後はわかりますよね?

投稿2021/07/18 15:28

BeatStar

総合スコア4962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kimuchiiii

2021/07/19 00:30

なんとかできました。丁寧なアドバイスありがとうございました。
guest

0

前もって掛け算九九みたいなテーブルを用意して,それを使う.

  • a * b を計算するとき,テーブルからダイレクトに答えを引けるなら使う.
  • 答えを引けないときは,一方の側をより小さい2つの整数に分割する.
    例えば,bb = c + d として, (a*c) + (a*d) という問題にする.

C++

1// 0*0 ~ NT*NT までの結果を引けるテーブルTbl[][] 2constexpr unsigned int NT = 10; 3unsigned int Tbl[NT][NT]; 4 5//※ここでは面倒だからこの関数でTbl[][]の中身を掛け算で作ってるけど, 6// ちまちまと値をハードコーディングなりすればよいかと. 7void InitTbl() 8{ 9 for( unsigned int a=0; a<10; ++a ) 10 { 11 for( unsigned int b=0; b<10; ++b ) 12 { Tbl[a][b] = a*b; } 13 } 14} 15 16//Tbl[][]を使った処理処理. 17unsigned int Mul_u( unsigned int a, unsigned int b ) 18{ 19 std::stack< std::pair<unsigned int, unsigned int> > Stk; 20 Stk.emplace( a,b ); 21 22 unsigned int Ans = 0; 23 while( !Stk.empty() ) 24 { 25 unsigned int a,b; 26 { 27 auto X = Stk.top(); 28 Stk.pop(); 29 a = X.first; 30 b = X.second; 31 } 32 33 if( a==0 || b==0 )continue; 34 35 if( a<NT && b<NT ) 36 { Ans += Tbl[a][b]; } 37 else if( a >= b ) 38 { 39 unsigned int ha = a>>1; 40 Stk.emplace( ha, b ); 41 Stk.emplace( a-ha, b ); 42 } 43 else 44 { 45 unsigned int hb = b>>1; 46 Stk.emplace( a, hb ); 47 Stk.emplace( a, b-hb ); 48 } 49 } 50 51 return Ans; 52} 53 54//a * b の計算 55int Mul( int a, int b ) 56{ 57 bool Neg = ( (a<0 && b>0) || (a>0 && b<0) ); 58 unsigned int AbsAns = Mul_u( abs(a), abs(b) ); 59 return ( Neg ? ( 0 - AbsAns ) : (int)AbsAns ); 60} 61 62int main(void) 63{ 64 InitTbl(); 65 66 int a = 15; 67 int b = -88; 68 std::cout << Mul(a,b) << std::endl; 69 return 0; 70}

投稿2021/07/19 06:24

fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/07/19 06:29

テーブルの大きさを育てていけば処理が高速になる可能性!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問