|
高精度,用一个线性表保存一个大整数,具体说,将大整数写成p进制数,线性表的每一项存p进制其中一位。 参考下面代码 #include <iostream>
1 ]8 q' m4 V# \+ a#include <memory>+ o0 \4 u: {6 _, F
# include <string>2 u$ i7 {. H5 T# k+ E. _: k
using namespace std; typedef long long hugeint; const int Base = 1000000000;
# `6 ]/ M& }) ?8 F+ a' hconst int Capacity = 200; struct xnum
' o. o9 |4 H5 M{# B" m: l" g( j
int Len;
$ k$ f4 U; m6 b$ S int Data[Capacity];
2 h& H- z1 r) I' K! ~! W! p xnum() : Len(0) {}
; r7 e6 |1 c. D! Y. I' r) G- S+ x xnum(const xnum& V) : Len(V.Len) { memcpy(Data, V.Data, Len * sizeof *Data); }
Q5 W# \3 e+ Z xnum(int V) : Len(0) { for (; V > 0; V /= Base) Data[Len++] = V % Base; }
# I0 t. ^' N& [+ @) l xnum& operator=(const xnum& V) { Len = V.Len; memcpy(Data, V.Data, Len * sizeof *Data); return *this; }0 R: Y9 J% q0 e0 T, V! q5 F
int& operator[](int Index) { return Data[Index]; }" s9 o* m: D* h
int operator[](int Index) const { return Data[Index]; }/ g1 [4 j' n5 `6 E' W4 I
};
' W9 w% O8 c V+ C2 T5 R+ Eint compare(const xnum& A, const xnum& B)
) h4 e5 ]# m' t- u{0 l: K" L6 d9 S
int I;
" U3 M* c1 m( x& f& u if (A.Len != B.Len) return A.Len > B.Len ? 1 : -1;8 r" R* V& H+ }4 u) p- @, I
for (I = A.Len - 1; I >= 0 && A[I] == B[I]; I--);. g. F6 }+ c2 q& l* d- l3 }
if (I < 0) return 0;
" } `1 p6 \$ R1 p5 b' z return A[I] > B[I] ? 1 : -1;3 @9 b& X0 @" @+ J# \0 ]% F' Z) y
} xnum operator+(const xnum& A, const xnum& B)
: W' k# j2 W+ ^& O& S( d{
- L6 C. b4 M F xnum R;
/ Q0 D3 \ \0 x% ]* j8 Z, p int I;
* f; h& K) q& P6 k int Carry = 0;
. P% B0 i: X/ w9 e# e% E for (I = 0; I < A.Len || I < B.Len || Carry > 0; I++)
3 E& y1 c/ J. c2 c/ B {
( F7 a% u" m# A0 r7 X if (I < A.Len) Carry += A[I];$ e5 A# x9 _6 _! F% f$ m
if (I < B.Len) Carry += B[I];! ] C1 _- S* }- y, z
R[I] = Carry % Base;1 k* K3 @- O3 z" ^! D# F- ^/ o: m# n
Carry /= Base;) B" k' w; z2 W( D' f
}
3 h2 c$ u6 `, V R.Len = I;3 C) s! D8 X5 e$ \
return R;) n' C8 @7 m! K, T% h# `
} xnum operator-(const xnum& A, const xnum& B)6 ~1 @5 Q, P) c1 L, d% u
{
1 t2 r! d) H# u0 m; R6 \1 ] xnum R;
2 S# A& R) [+ j$ y int Carry = 0;
) b# H- Y% A& T R.Len = A.Len;5 ^* [" P2 `3 J% o. z- u9 n; I
int I;
2 I# D9 M4 {* j9 J# {+ I8 Q. N ? for (I = 0; I < R.Len; I++) B9 w: j8 X3 q+ q! I" Y) K
{: f' ~" I4 Y7 K
R[I] = A[I] - Carry;' ^6 ~' n4 i0 P+ `4 e' n. M% L
if (I < B.Len) R[I] -= B[I];
& k! v: ?8 M. g if (R[I] < 0) Carry = 1, R[I] += Base;0 W# h* c( s, C7 y0 X3 G) z
else Carry = 0;
9 t4 W$ @; X0 h+ m" C }
1 W7 a$ [) U! r, ~7 ^1 s1 c while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;$ A( L! @7 C2 d; \5 c
return R;
0 p( v1 A% E+ c' l} xnum operator*(const xnum& A, const int B)& O N0 \; r5 X. K$ u% V5 P
{6 X, v+ y+ |0 ]+ J& t
int I;" ?* s- u* X. |. p
if (B == 0) return 0;7 R) W* M) e# q$ W6 F1 O1 K
xnum R;
% A: W4 s+ s7 y( c hugeint Carry = 0;
6 F5 s: L* K+ `' s+ l4 t1 q/ h for (I = 0; I < A.Len || Carry > 0; I++)" o" U; |+ y, Z2 l
{( G8 D) r7 M& r) l' K0 E6 O
if (I < A.Len) Carry += hugeint(A[I]) * B;/ V; n( N1 K7 o2 y
R[I] = Carry % Base;% x( Z. a& B: K, D9 z2 P6 i; d
Carry /= Base;! I2 d. u4 U' r k M$ N
}& _& r' I; f: r4 n+ T" l# M
R.Len = I;
6 t; R6 F) j( b& T' |& c return R;0 [1 q; N6 ]: {1 x
} xnum operator*(const xnum& A, const xnum& B)/ K% E8 a( k) ^; i; _" n
{
, r' [4 ~' Y3 ~ int I;% j- v0 I, d8 N. Y9 V
if (B.Len == 0) return 0;
- U7 q& t+ d! `/ k( g& \6 ? xnum R;; }8 p" O/ S" A9 r6 }0 L3 f
for (I = 0; I < A.Len; I++)
$ ^& [' I, P4 q3 ~ {- _1 M# R4 Q/ H9 @6 G
hugeint Carry = 0;! @' J Z3 {4 d6 v1 t/ J
for (int J = 0; J < B.Len || Carry > 0; J++)* r% e. R! {; C% @8 i! t5 }7 N
{7 b5 ?$ `3 e+ _) n
if (J < B.Len) Carry += hugeint(A[I]) * B[J];
n7 L- X9 Q/ d4 I/ @ if (I + J < R.Len) Carry += R[I + J];
+ R! A7 Q* o* k- u if (I + J >= R.Len) R[R.Len++] = Carry % Base;* Q m" E3 y" H/ o/ k6 ~( R
else R[I + J] = Carry % Base;2 F% ?0 E) \4 e! {
Carry /= Base;7 V1 A- i% F) t: r8 ]* d6 {
}
9 ^" F" n4 A( i/ _ }* o, h8 l) K7 V* w
return R;* w5 u; {4 z! W# H( P
} xnum operator/(const xnum& A, const int B)
8 s0 K$ I4 v' W6 W3 _{
. b3 d3 L) C& K! _! c xnum R;$ u5 [3 z( Z' b! S9 t
int I;4 Q+ h+ o2 D* w2 ~: u, r$ ~3 R7 a2 K
hugeint C = 0;4 p1 E& B$ R5 C, l" ~9 E% u$ A
for (I = A.Len - 1; I >= 0; I--)- w( O8 X# l8 M5 a Z: U) i8 y9 Z
{
) p7 h H- M+ k* j C = C * Base + A[I];
+ P8 U1 v: \/ k1 n R[I] = C / B;
' ]. [0 B* m: ?' h& @ C %= B;+ z! h1 t* ~8 y; E% u
}
5 [6 ^! L" C7 x8 x* q! m1 V/ l3 _5 A R.Len = A.Len;5 i; P) ~+ n m5 z8 w) u
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;2 z1 D3 _' n& Z3 P* `# U7 r5 B
return R;
8 ^9 ~ q: ~/ m- `' T7 }) `} xnum operator/(const xnum& A, const xnum& B)
& i6 g. ^- r) \( \, }, K{- v) M7 g9 j8 b5 k: I3 M
int I;
1 {1 ]; N: a) I/ P; \ xnum R, Carry = 0;
0 [3 c) y4 y# K4 |% b8 a' F int Left, Right, Mid;
$ o* ?9 r! f! s+ B: t for (I = A.Len - 1; I >= 0; I--)
( f9 d9 J* J5 {. I' `) G3 g {
6 i5 d H" T4 j/ t Carry = Carry * Base + A[I];
+ y4 I2 q- `+ H; E" r Left = 0;
* k) a8 q5 b$ M0 g$ @ g Right = Base - 1;
, n: j: a0 V. g, z while (Left < Right)
; l4 {: `; z# ~" [4 S! U6 j {
! |- m5 d8 u9 \6 I& [ i/ j1 L Mid = (Left + Right + 1) / 2;
& \. S4 C: w- u5 P6 C8 T if (compare(B * Mid, Carry) <= 0) Left = Mid;$ G/ E6 L4 e" t0 ?# W, n
else Right = Mid - 1;" H) y5 X8 r- C( j+ M F
}
+ v# n# ~2 b7 z- y9 N3 w4 h R[I] = Left; |4 K- w5 R: J: K7 P2 }* q8 w
Carry = Carry - B * Left;
. i5 H- U" o+ B b! i }( G @+ |. ?/ g
R.Len = A.Len;
2 @( I# u( [" P- O$ Z6 K: X while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
/ e) w/ c( ~7 H8 ^ B return R;
" {% W2 l& H9 Q% ~8 f! M}
! v; ^& u/ d% P6 Z) q+ |0 E1 Jxnum operator%(const xnum& A, const xnum& B)
/ P6 A: I9 {# U& d9 N! z! m{
" `1 Y/ |5 ^) C9 e4 c0 e* a0 j int I;
& K8 a& g( k9 {, x# s7 Y+ I( j xnum R, Carry = 0;
; [* }0 M# X+ G int Left, Right, Mid;/ }) y4 U3 {" b0 _
for (I = A.Len - 1; I >= 0; I--)6 S) v* i3 ?9 h9 w% E, W+ k. M
{
. N8 {6 S* O0 ]2 Q Carry = Carry * Base + A[I];
/ M v6 Y) H: G H# x1 L/ u Left = 0;
- g/ ~5 K ]. M Right = Base - 1;
7 ?! Q" Q" W! `0 L! V: q% q' L while (Left < Right)0 b6 Z; z- |. L
{
) X& r/ j; V' N3 g) I Mid = (Left + Right + 1) / 2;
/ `. F& e6 R b if (compare(B * Mid, Carry) <= 0) Left = Mid;. h5 Z5 r1 J. i) h4 J* p. D
else Right = Mid - 1;
, i! n) ` b0 Q+ w7 C& q) k, G }6 P; u* J( z1 x0 b0 _* h; `
R[I] = Left;
2 o K9 \! D: L Carry = Carry - B * Left;/ L# ^5 R, O$ n% a$ t
}+ y, t4 }8 [( ]# Z4 T: W; `
R.Len = A.Len;( w3 }, ^& E( b: A
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;& x) E" _2 y9 p- b: w" w% ^! ?
return Carry;
# f( T& j+ T: w} istream& operator>>(istream& In, xnum& V)
7 S1 {1 A; p* j; |2 J: f {9 s{" q C$ t& X+ H6 p0 Z: F" h! c* L
char Ch;
+ y# u: q! i1 M5 J1 J: z( } for (V = 0; In >> Ch;)" r8 Y- h/ ~) L% q4 e9 A2 ]
{
1 ?. n" Q7 j" `2 O9 W, M V = V * 10 + (Ch - '0');* O; K1 F) q" D1 t
if (cin.peek() <= ' ') break;
, T& R {0 k0 r }
/ Q9 E- Y$ P/ q3 C* } return In;/ e5 S. S/ I v% [
} ostream& operator<<(ostream& Out, const xnum& V)
- Z0 k, r' x* [& K: {, b5 G9 G{
* T* f ]" P/ y int I;
4 k! V1 d. k' A" ]. v8 P( t& N Out << (V.Len == 0 ? 0 : V[V.Len - 1]); q/ \1 e3 \8 c( H- a/ B
for (I = V.Len - 2; I >= 0; I--) for (int J = Base / 10; J > 0; J /= 10) Out << V[I] / J % 10;# e% G. g. W3 z7 T. ^/ G
return Out;6 ]6 ]9 h' Z! U
}
/ Z; V ?: E' |5 D( e- \ |