c++言語の質問です。演算子*を使わずに2個の整数同士の掛け算を出力する方法が分かりません。どなたか教えてくださるとありがたいです。よろしくお願いいたします、
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
真面目に回答しておきましょう
あなたが、XXX * YYY という問題を出されたとき、筆算でどうやってそれを解くでしょうか。
まさか3桁どおしの掛け算ができないとは言いませんよね?
その方法をそのとおりに、コードにしていけばいいのです
投稿2021/07/18 14:50
総合スコア88042
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/18 14:54
2021/07/18 15:04
2021/07/18 15:12
2021/07/18 15:13
2021/07/18 15:20 編集
2021/07/18 15:19
2021/07/18 15:21
2021/07/18 22:12
2021/07/18 22:21 編集
2021/07/18 22:22
2021/07/18 22:30 編集
2021/07/18 23:00
2021/07/18 23:11 編集
2021/07/18 23:14
2021/07/18 23:17
2021/07/18 23:21
2021/07/18 23:23 編集
2021/07/19 07:55 編集
0
0 + x + x + x + .... のように、0 に x を y 回足せば x*y が求まります。
投稿2021/07/18 14:37
総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/18 14:40
2021/07/18 23:47
2021/07/19 00:29
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総合スコア8224
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/19 12:36
2021/07/19 14:29
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
総合スコア4962
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
前もって掛け算九九みたいなテーブルを用意して,それを使う.
a * b
を計算するとき,テーブルからダイレクトに答えを引けるなら使う.- 答えを引けないときは,一方の側をより小さい2つの整数に分割する.
例えば,b
をb = 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
総合スコア11996
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。