回答編集履歴

1

動作確認ソース

2016/02/01 14:54

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -23,3 +23,243 @@
23
23
  しかし、インプレース処理を考慮してなくても、結果が0になることはあまりないです。
24
24
 
25
25
  signについては確認されているようなので、coco_bauerさんの指摘が当たっていると言うことはないとは思うのですが...
26
+
27
+
28
+
29
+ ---
30
+
31
+ 【追記】
32
+
33
+ 動作確認したソースを上げておきます。
34
+
35
+ `NUMBER`と`multiple`の内容は修正していません。
36
+
37
+ ```C++
38
+
39
+ #include <iostream>
40
+
41
+
42
+
43
+ #define KETA 3
44
+
45
+
46
+
47
+ struct NUMBER
48
+
49
+ {
50
+
51
+ int n[KETA];/*KETA個の桁*/
52
+
53
+ int sign;/*符号、正なら1、負なら-1*/
54
+
55
+ };
56
+
57
+
58
+
59
+ void clearByZero(struct NUMBER *c)
60
+
61
+ {
62
+
63
+ for (int i=0; i < KETA; ++i)
64
+
65
+ c->n[i]=0;
66
+
67
+ c->sign=0;
68
+
69
+ }
70
+
71
+ void mulBy10(struct NUMBER *a, struct NUMBER *b)
72
+
73
+ {
74
+
75
+ for (int i=KETA-1; 0 < i; --i)
76
+
77
+ b->n[i]=a->n[i-1];
78
+
79
+ }
80
+
81
+ void add(struct NUMBER *a, struct NUMBER *b, struct NUMBER *c)
82
+
83
+ {
84
+
85
+ int h=0;
86
+
87
+ for (int i=0; i < KETA; ++i)
88
+
89
+ {
90
+
91
+ int x=a->n[i]+b->n[i]+h;
92
+
93
+ c->n[i]=x%10;
94
+
95
+ h=x/10;
96
+
97
+ }
98
+
99
+ }
100
+
101
+
102
+
103
+ void print(char const* t, struct NUMBER *a)
104
+
105
+ {
106
+
107
+ std::cout << t;
108
+
109
+ if (a->sign > 0) {
110
+
111
+ std::cout << "+ ";
112
+
113
+ } else if (a->sign < 0) {
114
+
115
+ std::cout << "- ";
116
+
117
+ } else {
118
+
119
+ std::cout << " ";
120
+
121
+ }
122
+
123
+ for (int i=KETA-1; 0 <= i; --i)
124
+
125
+ std::cout << a->n[i] << " ";
126
+
127
+ std::cout << "\n";
128
+
129
+ }
130
+
131
+
132
+
133
+ int multiple(struct NUMBER *a,struct NUMBER *b,struct NUMBER *c)
134
+
135
+ {
136
+
137
+ struct NUMBER d;
138
+
139
+ int asign=a->sign;
140
+
141
+ int bsign=b->sign;
142
+
143
+ int i,j;
144
+
145
+ int h=0;
146
+
147
+ int x;
148
+
149
+
150
+
151
+ clearByZero(c);
152
+
153
+
154
+
155
+ a->sign=1;
156
+
157
+ b->sign=1;
158
+
159
+
160
+
161
+ for(i=0;i<KETA-1;i++)
162
+
163
+ {
164
+
165
+ for(j=0;j<KETA;j++)
166
+
167
+ {
168
+
169
+ d.n[j]=((a->n[j]*b->n[i])+h)%10;
170
+
171
+ h=((a->n[j]*b->n[i])+h)/10;
172
+
173
+ }
174
+
175
+ for(x=i;x>0;x--)
176
+
177
+ {
178
+
179
+ mulBy10(&d,&d);
180
+
181
+ }
182
+
183
+ add(c,&d,c);
184
+
185
+ }
186
+
187
+
188
+
189
+ if(asign==bsign)
190
+
191
+ {
192
+
193
+ c->sign=1;
194
+
195
+ }
196
+
197
+ else
198
+
199
+ {
200
+
201
+ c->sign=-1;
202
+
203
+ }
204
+
205
+ return (0);
206
+
207
+ }
208
+
209
+
210
+
211
+ int main()
212
+
213
+ {
214
+
215
+ NUMBER a={{2,1,0},1};
216
+
217
+ NUMBER b={{2,0,0},1};
218
+
219
+ NUMBER c;
220
+
221
+ clearByZero(&c);
222
+
223
+
224
+
225
+ print("a=", &a);
226
+
227
+ print("b=", &b);
228
+
229
+ print("c=", &c);
230
+
231
+ multiple(&a, &b, &c);
232
+
233
+ std::cout << "\n";
234
+
235
+ print("c=", &c);
236
+
237
+
238
+
239
+ return 0;
240
+
241
+ }
242
+
243
+ ```
244
+
245
+ MinGW 5.2.0とmsvc 2015で下記のように出力されます。
246
+
247
+
248
+
249
+ ```
250
+
251
+ a=+ 0 1 2
252
+
253
+ b=+ 0 0 2
254
+
255
+ c= 0 0 0
256
+
257
+
258
+
259
+ c=+ 0 2 4
260
+
261
+ ```
262
+
263
+
264
+
265
+ コピペ+やっつけなので、変数名等は適当です。