|
大整数的+-× /, 一般是将大整数看做一个字符串,每一位上的数字对应一个字符,然后对字符串进行处理。下面是进行大整数加法运算的例子,其他采用相同的方法可以实现。
4y2a+l$P0qi%jUZ
Mhy M"H]F\www.linuxeden.com#include <stdio.h>
lS!Q2D$|I~www.linuxeden.com#include <stdlib.h>
ODTg*IpWLinux伊甸园论坛#include <string.h>;]&eI$U.Ab1LR
#define SIZE 5000c*l!?;B/@9h
Q
RIGJpLinux伊甸园论坛char *pa; // 字符串a首地址
!IC
m [3?0f,dHchar *pb; // 字符串b首地址
a/_7wie{Kchar *p_sum; // 结果字符串Av-BnK1Z(w
G
int len_a = 0; // 字符串a的长度Linux伊甸园论坛fFD-yT
int len_b = 0; // 字符串b的长度K-qt"R D-i,g_
z/\E-PQ*Xwww.linuxeden.comvoid add();H$f NE\N pi%b1g
{
/E(rF,{/g:lP int len; // 结果字符串的长度3?z*Mn5Z.g+[
int carry = 0; // 是否有进位
%?"]$T}]
Z%s*Z"] char *start_a = pa+len_a-1; // 从a的个位开始'\!{
oz
I `*[V ])T
char *start_b = pb+len_b-1; // 从b的个位开始www.linuxeden.com3yO:NF,c
S
Za0W%|
char *start_c; // 结果的个位Linux伊甸园论坛 q%|V^8z
5Q)qm+w S#D[ len = len_a>len_b?len_a:len_b;
c_q o:a.t p_sum = (char*)malloc((len + 2) * sizeof(char));*T7P cC$?i
]4t
N
start_c = p_sum+len;
&^N[u"nVd *(p_sum+len+1) = '\0';,d-P v%~(\,Q5d7jL
[7S9I,Ggy*T while((start_a >= pa) && (start_b >= pb))+TAow!F]0T'i{
{
m1t-Rq2B
u;?ALinux伊甸园论坛 if(*start_a + *start_b + carry - '0' <= '9')"oN2y1eW$YyA`
{
+e+W1i)r5Y&[2VC *start_c = *start_a + *start_b + carry - '0';
0k/G
|0]j!p5xA \*} carry = 0;
t1m;y/{A7NiZ@[i } V2AS1nU3E;yC
elseC^
j(cc!Z#~-hH j(K
{V3hY|0O7Q ?:{xS
*start_c = *start_a + *start_b + carry - '9' - 1;
"r+Zc._6F$p
Ny+ubdwww.linuxeden.com carry = 1;
x+e!R{.d7H }
-do;lznf start_a--;[5c+P
A.RqF*{8|
start_b--;Linux伊甸园论坛J&E,?j.~ZF
start_c--;liU0Wm4iz
}0N;\)m8zg5KE
-OT4j7hJF3Lwww.linuxeden.com while(start_a >= pa)
gf)EiyU)RG%Ylwww.linuxeden.com {Ic gS{KT
M
if(*start_a + carry <= '9')www.linuxeden.com
O9NB\%a
{Linux伊甸园论坛[@{-snj(w
*start_c = *start_a + carry;
Q+tL)H0kR carry = 0;NDsT1^(`
};sv h ^1`(CA,H
elseQI/H"Ywa
{Q2XqGT_uP
*start_c = *start_a + carry - 10;(hM)\S&z`2Y1rQ
carry = 1;
M~%L/m6[.n$mY:j] }
$iU fu&Q;F(b start_a--;:b'RS}&I$|
start_c--;
h3O&Q2D8F2Wo }
!YdL$c"f ]3^.FLinux伊甸园论坛4o)Bd/f/q)^ I
while(start_b >= pb)Linux伊甸园论坛z/L2ke.X
l U@
{&\ t-['mb,h
X2p tp
if(*start_b + carry <= '9')www.linuxeden.com;D{k
[t&Tup
{Linux伊甸园论坛9X3N9_ZD7P
*start_c = *start_b + carry;"xF} {z7Rxf-z
o
carry = 0;
HM?6M-c8Xwww.linuxeden.com }o _2}}3U
elseLinux伊甸园论坛Ry^}^
S,]h W'B
{
/K
T3pv~tR,G&d9b *start_c = *start_b + carry - 10;Linux伊甸园论坛2b#q/J_J@
carry = 1;*S2|4|6ho
}
#r%KI,DID H6y&]{ start_b--;
4yB5cR%P%o,vLinux伊甸园论坛 start_c--;(l"}}e5hW` }
}
~%B6_b sWr
B[Y!S
] U+g(t if(carry)1AQ9Y8~#_B(`
{
.k8s.n@Fh&n *p_sum = '1';L!t!Z6b,}j p a+e@
start_c = p_sum;
iT}bNy-v6f_4C }YNOi4AO%]7A;y
elsewww.linuxeden.com!hWQ/lC5xY/@3w
{$q{*Ms#e"C:g@
start_c = p_sum + 1;
PfP4ut](k$OLinux伊甸园论坛 }
R?Gl~`bLinux伊甸园论坛Linux伊甸园论坛'\7`&[2~x+dJ2c)HB
printf("%s + %s = %s\n", pa, pb, start_c);
Vp-]'`nF
rv GAPLinux伊甸园论坛 free(pa);:uZ8s9nl[#~
free(pb);Q6T/N3B0B$\/S2\Hd/^
free(p_sum);O)p%Y{*lY4c0f
}www.linuxeden.comY.qE4b'goQ
Linux伊甸园论坛-[:o~._vh~
int main(void)
"hQ5zgUS#A4p"nLinux伊甸园论坛{'m:kZEb
char arr_in[SIZE];Linux伊甸园论坛}6I6C!P.lw;l
Linux伊甸园论坛{BjA&T`uT
printf("Please input a: ");
zyt|%Z:XLinux伊甸园论坛 scanf("%s", arr_in);{/E\{Jq?
len_a = strlen(arr_in);www.linuxeden.comng&aPG^[
pa = (char *)malloc((len_a + 1) * sizeof(char));
WP*?d)m3HSHT\w#Mwww.linuxeden.com strcpy(pa, arr_in);-V2|+v|4b
&gWj8H*[:Y printf("Please input b: ");VCD0g8d2WN&b+|J
scanf("%s", arr_in);
Cu;@dAq)XK}8]? len_b = strlen(arr_in);
?*Y Y7i`fZ pb = (char *)malloc((len_b + 1) * sizeof(char));
[[$E$Izr strcpy(pb, arr_in);k^*VI~!SF
|