/*
大数加法的关键在于用字符型的数组解决问题,两个字符数组用于存储将要进行计算的数据,另一个整形数组或字符数组存储结果.分析:使两个字符串中的字符数字都减去'0',逐个相加大于10的可以使本位减去10,下一位自增1,
例如定义:char a[],b[];int c[];则c[]=a[]-'0'+b[]-'0';接着就是处理进位问题*/
#include<stdio.h>
#include<string.h>
#define M 10002
char
a
[
M
],
b
[
M
];
int
c
[
M
];
int
main
()
{
int
i
,
t
,
j
,
L1
,
L2
,
k
,
cas
,
x
,
flag
;
scanf
(
"%d"
,
&
t
);
getchar
();
cas
=
1
;
while
(
t
)
{
scanf
(
"%s %s"
,
a
,
b
);
L1
=
strlen
(
a
);
//记录数组a的长度
L2
=
strlen
(
b
);
//记录数组b的长度
k
=
0
;
flag
=
0
;
memset
(
c
,
0
,
sizeof
(
c
));
//数组c用来记录a[i]+b[i]的值,即两数相加的和
printf
(
"Case %d:
\n
"
,
cas
++
);
printf
(
"%s + %s = "
,
a
,
b
);
for
(
i
=
0
;;
i
++
)
{
if
(
i
<
L1
&&
i
<
L2
)
{
c
[
k
]
=
(
a
[
L1
-
i
-
1
]
-
'0'
)
+
(
b
[
L2
-
i
-
1
]
-
'0'
)
+
flag
;
flag
=
0
;
if
(
c
[
k
]
>
9
)
//如果该位大于10,则进1
{
c
[
k
]
=
c
[
k
]
-
10
;
flag
=
1
;
}
k
++
;
}
else
break
;
}
if
(
L2
<
L1
)
//如果数组b的长度小于数组a的长度
{
while
(
i
<
L1
)
{
c
[
k
++
]
+=
a
[
L1
-
1
-
i
]
-
'0'
+
flag
;
i
++
;
flag
=
0
;
}
}
else
if
(
L2
>
L1
)
//如果数组a的长度小于数组b的长度
{
while
(
i
<
L2
)
{
c
[
k
++
]
+=
b
[
L2
-
1
-
i
]
-
'0'
+
flag
;
i
++
;
flag
=
0
;
}
}
else
if
(
L1
==
L2
)
//如果a的长度与b相等
{
if
(
c
[
k
]
==
1
)
k
=
k
+
1
;
}
k
=
k
-
1
;
while
(
k
>=
0
)
//倒着输出
{
printf
(
"%d"
,
c
[
k
]);
k
=
k
-
1
;
}
if
(
t
>
1
)
printf
(
"
\n\n
"
);
else
printf
(
"
\n
"
);
t
=
t
-
1
;
}
return
0
;
}