こんにちは。
KETA=3、a=12, b=2でやってみましたら、c=24と適切な結果を得ることができました。
これらは正しく作動するものとします。(というかしています。)
本当に正しく動作していますでしょうか?
下記は入力と出力に同じ領域を指定していますが、そのような使い方でも正しく動作することを確認されてますか?
mulBy10(&d,&d);
add(c,&d,c);
しかし、インプレース処理を考慮してなくても、結果が0になることはあまりないです。
signについては確認されているようなので、coco_bauerさんの指摘が当たっていると言うことはないとは思うのですが...
【追記】
動作確認したソースを上げておきます。
NUMBER
とmultiple
の内容は修正していません。
C++
1 # include <iostream>
2
3 # define KETA 3
4
5 struct NUMBER
6 {
7 int n [ KETA ] ; /*KETA個の桁*/
8 int sign ; /*符号、正なら1、負なら-1*/
9 } ;
10
11 void clearByZero ( struct NUMBER * c )
12 {
13 for ( int i = 0 ; i < KETA ; ++ i )
14 c -> n [ i ] = 0 ;
15 c -> sign = 0 ;
16 }
17 void 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 }
22 void 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
33 void 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
48 int 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
87 int 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
コピペ+やっつけなので、変数名等は適当です。