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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

3339閲覧

多倍長の乗算について。

Gogetsu_azusa

総合スコア13

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/02/01 06:55

こんにちは。現在、多倍長演算として、乗算(掛け算)を作っているのですが、うまくいかないです。プログラムは以下にありますが、a*b=cにしたいです。
構造体の定義はこちらです。
struct NUMBER
{
int n[KETA];/KETA個の桁/
int sign;/符号、正なら1、負なら-1/
};
clearByZero(a)は、配列の中身を全て0にします。
mulBy10(b,c)は、bを10倍したものをcに代入します。
add(d,e,f)は、dとeを足したものをfに代入します。
これらは正しく作動するものとします。(というかしています。)


int multiple(struct NUMBER *a,struct NUMBER *b,struct NUMBER *c)
{
struct NUMBER d;
int asign=a->sign;
int bsign=b->sign;
int i,j;
int h=0;
int x;

clearByZero(c);

a->sign=1;
b->sign=1;

for(i=0;i<KETA-1;i++)
{
for(j=0;j<KETA;j++)
{
d.n[j]=((a->n[j]*b->n[i])+h)%10;
h=((a->n[j]*b->n[i])+h)/10;
}
for(x=i;x>0;x--)
{
mulBy10(&d,&d);
}
add(c,&d,c);
}

if(asign==bsign)
{
c->sign=1;
}
else
{
c->sign=-1;
}
return (0);
}

実行結果としては、どうしようと0になります。
正負の扱いに関しては上手くいっています。

添削の程よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/02/01 07:10

他のユーザから「意図的に内容が抹消された質問」という指摘を受けました 解決後に編集機能を用いて質問内容を改変し関係のない内容にしたり、内容を削除する行為は禁止しています。 投稿していただいた質問は、後に他の誰かが困ったときに助けになる情報資産になると考えるからです。 「質問を編集する」ボタンから編集を行い、他のユーザにも質問内容が見えるように修正してください。
shanxia

2016/02/01 07:14

他のユーザから「意図的に内容が抹消された質問」という指摘を受けました 解決後に編集機能を用いて質問内容を改変し関係のない内容にしたり、内容を削除する行為は禁止しています。 投稿していただいた質問は、後に他の誰かが困ったときに助けになる情報資産になると考えるからです。 「質問を編集する」ボタンから編集を行い、他のユーザにも質問内容が見えるように修正してください。
coco_bauer

2016/02/01 07:51

プログラムの最後から2行目が、return (0); となっていますから、返り値は当然0になるでしょう。引数として渡した c の値も、実行後に常に0になるのですか?
guest

回答3

0

解凍してくださった方々ありがとうございました。

投稿2016/02/02 09:31

Gogetsu_azusa

総合スコア13

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

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

0

多倍長演算のルーチンを「使うこと」が目的なら、boostライブラリに多倍長演算のライブラリがあります。
boost多倍長整数
boost多倍長浮動小数点数

ルーチンを「自作すること」が目的ならすいません。

投稿2016/02/01 09:44

PineMatsu

総合スコア3579

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

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

Gogetsu_azusa

2016/02/01 10:59

解答ありがとうございます。 そうですね、自作したいです。
guest

0

ベストアンサー

こんにちは。

KETA=3、a=12, b=2でやってみましたら、c=24と適切な結果を得ることができました。

これらは正しく作動するものとします。(というかしています。)

本当に正しく動作していますでしょうか?
下記は入力と出力に同じ領域を指定していますが、そのような使い方でも正しく動作することを確認されてますか?

mulBy10(&d,&d);
add(c,&d,c);

しかし、インプレース処理を考慮してなくても、結果が0になることはあまりないです。
signについては確認されているようなので、coco_bauerさんの指摘が当たっていると言うことはないとは思うのですが...


【追記】
動作確認したソースを上げておきます。
NUMBERmultipleの内容は修正していません。

C++

1#include <iostream> 2 3#define KETA 3 4 5struct NUMBER 6{ 7 int n[KETA];/*KETA個の桁*/ 8 int sign;/*符号、正なら1、負なら-1*/ 9}; 10 11void clearByZero(struct NUMBER *c) 12{ 13 for (int i=0; i < KETA; ++i) 14 c->n[i]=0; 15 c->sign=0; 16} 17void mulBy10(struct NUMBER *a, struct NUMBER *b) 18{ 19 for (int i=KETA-1; 0 < i; --i) 20 b->n[i]=a->n[i-1]; 21} 22void add(struct NUMBER *a, struct NUMBER *b, struct NUMBER *c) 23{ 24 int h=0; 25 for (int i=0; i < KETA; ++i) 26 { 27 int x=a->n[i]+b->n[i]+h; 28 c->n[i]=x%10; 29 h=x/10; 30 } 31} 32 33void print(char const* t, struct NUMBER *a) 34{ 35 std::cout << t; 36 if (a->sign > 0) { 37 std::cout << "+ "; 38 } else if (a->sign < 0) { 39 std::cout << "- "; 40 } else { 41 std::cout << " "; 42 } 43 for (int i=KETA-1; 0 <= i; --i) 44 std::cout << a->n[i] << " "; 45 std::cout << "\n"; 46} 47 48int multiple(struct NUMBER *a,struct NUMBER *b,struct NUMBER *c) 49{ 50 struct NUMBER d; 51 int asign=a->sign; 52 int bsign=b->sign; 53 int i,j; 54 int h=0; 55 int x; 56 57 clearByZero(c); 58 59 a->sign=1; 60 b->sign=1; 61 62 for(i=0;i<KETA-1;i++) 63 { 64 for(j=0;j<KETA;j++) 65 { 66 d.n[j]=((a->n[j]*b->n[i])+h)%10; 67 h=((a->n[j]*b->n[i])+h)/10; 68 } 69 for(x=i;x>0;x--) 70 { 71 mulBy10(&d,&d); 72 } 73 add(c,&d,c); 74 } 75 76 if(asign==bsign) 77 { 78 c->sign=1; 79 } 80 else 81 { 82 c->sign=-1; 83 } 84 return (0); 85} 86 87int main() 88{ 89 NUMBER a={{2,1,0},1}; 90 NUMBER b={{2,0,0},1}; 91 NUMBER c; 92 clearByZero(&c); 93 94 print("a=", &a); 95 print("b=", &b); 96 print("c=", &c); 97 multiple(&a, &b, &c); 98 std::cout << "\n"; 99 print("c=", &c); 100 101 return 0; 102}

MinGW 5.2.0とmsvc 2015で下記のように出力されます。

a=+ 0 1 2 b=+ 0 0 2 c= 0 0 0 c=+ 0 2 4

コピペ+やっつけなので、変数名等は適当です。

投稿2016/02/01 09:08

編集2016/02/01 14:54
Chironian

総合スコア23272

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

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

Gogetsu_azusa

2016/02/02 09:30

解答ありがとうございました! おっしゃる通りで、add(足し算)に問題がありました。 a=a+bにできませんでした。 直したら上手くいきました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問