teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

動作確認ソース

2016/02/01 14:54

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -10,4 +10,124 @@
10
10
  > add(c,&d,c);
11
11
 
12
12
  しかし、インプレース処理を考慮してなくても、結果が0になることはあまりないです。
13
- signについては確認されているようなので、coco_bauerさんの指摘が当たっていると言うことはないとは思うのですが...
13
+ signについては確認されているようなので、coco_bauerさんの指摘が当たっていると言うことはないとは思うのですが...
14
+
15
+ ---
16
+ 【追記】
17
+ 動作確認したソースを上げておきます。
18
+ `NUMBER`と`multiple`の内容は修正していません。
19
+ ```C++
20
+ #include <iostream>
21
+
22
+ #define KETA 3
23
+
24
+ struct NUMBER
25
+ {
26
+ int n[KETA];/*KETA個の桁*/
27
+ int sign;/*符号、正なら1、負なら-1*/
28
+ };
29
+
30
+ void clearByZero(struct NUMBER *c)
31
+ {
32
+ for (int i=0; i < KETA; ++i)
33
+ c->n[i]=0;
34
+ c->sign=0;
35
+ }
36
+ void mulBy10(struct NUMBER *a, struct NUMBER *b)
37
+ {
38
+ for (int i=KETA-1; 0 < i; --i)
39
+ b->n[i]=a->n[i-1];
40
+ }
41
+ void add(struct NUMBER *a, struct NUMBER *b, struct NUMBER *c)
42
+ {
43
+ int h=0;
44
+ for (int i=0; i < KETA; ++i)
45
+ {
46
+ int x=a->n[i]+b->n[i]+h;
47
+ c->n[i]=x%10;
48
+ h=x/10;
49
+ }
50
+ }
51
+
52
+ void print(char const* t, struct NUMBER *a)
53
+ {
54
+ std::cout << t;
55
+ if (a->sign > 0) {
56
+ std::cout << "+ ";
57
+ } else if (a->sign < 0) {
58
+ std::cout << "- ";
59
+ } else {
60
+ std::cout << " ";
61
+ }
62
+ for (int i=KETA-1; 0 <= i; --i)
63
+ std::cout << a->n[i] << " ";
64
+ std::cout << "\n";
65
+ }
66
+
67
+ int multiple(struct NUMBER *a,struct NUMBER *b,struct NUMBER *c)
68
+ {
69
+ struct NUMBER d;
70
+ int asign=a->sign;
71
+ int bsign=b->sign;
72
+ int i,j;
73
+ int h=0;
74
+ int x;
75
+
76
+ clearByZero(c);
77
+
78
+ a->sign=1;
79
+ b->sign=1;
80
+
81
+ for(i=0;i<KETA-1;i++)
82
+ {
83
+ for(j=0;j<KETA;j++)
84
+ {
85
+ d.n[j]=((a->n[j]*b->n[i])+h)%10;
86
+ h=((a->n[j]*b->n[i])+h)/10;
87
+ }
88
+ for(x=i;x>0;x--)
89
+ {
90
+ mulBy10(&d,&d);
91
+ }
92
+ add(c,&d,c);
93
+ }
94
+
95
+ if(asign==bsign)
96
+ {
97
+ c->sign=1;
98
+ }
99
+ else
100
+ {
101
+ c->sign=-1;
102
+ }
103
+ return (0);
104
+ }
105
+
106
+ int main()
107
+ {
108
+ NUMBER a={{2,1,0},1};
109
+ NUMBER b={{2,0,0},1};
110
+ NUMBER c;
111
+ clearByZero(&c);
112
+
113
+ print("a=", &a);
114
+ print("b=", &b);
115
+ print("c=", &c);
116
+ multiple(&a, &b, &c);
117
+ std::cout << "\n";
118
+ print("c=", &c);
119
+
120
+ return 0;
121
+ }
122
+ ```
123
+ MinGW 5.2.0とmsvc 2015で下記のように出力されます。
124
+
125
+ ```
126
+ a=+ 0 1 2
127
+ b=+ 0 0 2
128
+ c= 0 0 0
129
+
130
+ c=+ 0 2 4
131
+ ```
132
+
133
+ コピペ+やっつけなので、変数名等は適当です。