|
高精度,用一个线性表保存一个大整数,具体说,将大整数写成p进制数,线性表的每一项存p进制其中一位。 参考下面代码 #include <iostream>; v! K! J4 `( p6 Q( a d [$ M: o
#include <memory>; t* [2 P" E; D9 f0 ]8 g# _; h2 C( R
# include <string>
# W: z3 l. i9 n. d9 e1 \' L& Ausing namespace std; typedef long long hugeint; const int Base = 1000000000;. l( X* R' S3 @& J# B6 @0 S
const int Capacity = 200; struct xnum" @5 T+ G1 V+ z& K
{
7 R: F( `! \1 ?8 H% }% {0 e int Len;& c7 j" K2 p% d' h' l2 u, k
int Data[Capacity];
, r; W/ H. G+ L0 y, C xnum() : Len(0) {}
5 K8 j6 h$ @" \ xnum(const xnum& V) : Len(V.Len) { memcpy(Data, V.Data, Len * sizeof *Data); }
) S6 K! b# c- a/ Z0 m+ y# J xnum(int V) : Len(0) { for (; V > 0; V /= Base) Data[Len++] = V % Base; }
9 U6 l$ r0 D t& U( F xnum& operator=(const xnum& V) { Len = V.Len; memcpy(Data, V.Data, Len * sizeof *Data); return *this; }
2 R1 O! K' f0 e$ d# P int& operator[](int Index) { return Data[Index]; }/ b; S7 d* T3 h' y
int operator[](int Index) const { return Data[Index]; }8 m+ r& w2 S8 n* F
}; ! C( g5 N) y% j$ U
int compare(const xnum& A, const xnum& B)
7 E. V5 U" t7 E{
5 Q( u& @1 s& I2 {0 B5 k int I;
* I* i+ _$ k$ L' G, N if (A.Len != B.Len) return A.Len > B.Len ? 1 : -1;
& G2 g5 s, e, [' W! R. C for (I = A.Len - 1; I >= 0 && A[I] == B[I]; I--);: C7 l* X3 x( }
if (I < 0) return 0;
3 ` Z5 I0 F! k! N return A[I] > B[I] ? 1 : -1;7 f: i: W5 ~, a5 e5 }
} xnum operator+(const xnum& A, const xnum& B). @( C6 D- Z* t0 u
{' g; O( W7 }6 X0 \$ t
xnum R;( P3 R( T* `# F' S0 L) l' S$ ~
int I;3 t! u- E$ ~7 Q9 P/ B. n) _) T
int Carry = 0;& w/ S( `- T6 D# d2 F* z o. g$ v8 n% D
for (I = 0; I < A.Len || I < B.Len || Carry > 0; I++)
3 l" a, H8 h8 t& m* l" c8 {# ^ {
$ j5 H; e& b2 Z/ p* z if (I < A.Len) Carry += A[I];
4 l: `/ e/ E! A' k* x if (I < B.Len) Carry += B[I];
# U* n; D6 w3 W R[I] = Carry % Base;& W/ a" e0 m0 I- ^, X
Carry /= Base;- w; o0 L: G6 t# d
}5 H1 q4 j( b+ b7 d
R.Len = I;- P; b) J9 Y( ~1 S6 x8 N, U0 \0 p
return R;* K: P: T+ X2 p$ n
} xnum operator-(const xnum& A, const xnum& B)
( m- H5 r$ m/ K* o3 E/ c{( {" ?9 n2 e4 j1 F& S. Q* I% v3 X
xnum R;1 u; v0 Q( _' g+ D2 U) b% O: ^* V
int Carry = 0;9 k" m5 l9 }& x% ]
R.Len = A.Len;; ?- P( m* }' ~/ Q
int I;
2 D; t. m' o6 o! _ for (I = 0; I < R.Len; I++)0 E0 E+ \) V4 h7 ^6 I
{* R ^5 x; J7 [" t9 |) N
R[I] = A[I] - Carry;
& J/ J0 _: \8 A7 I if (I < B.Len) R[I] -= B[I];
) f) ?! f3 g2 O) s0 E( U if (R[I] < 0) Carry = 1, R[I] += Base;! o/ Z% O. G) V6 @
else Carry = 0;
% }; ]0 o) s0 F3 S }
1 s4 T& r8 H7 i while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
! q* P! e$ x& F+ C1 e% V: G return R; p3 e# x" e* u: r) M: f
} xnum operator*(const xnum& A, const int B)
4 {2 M4 O- f" e5 `3 [: ]{4 B& A0 z3 S2 M( C* |% G3 d" M
int I;' g, [; \% _1 q @) X7 m9 I! X
if (B == 0) return 0;
; B' N( F! t2 l2 B- a xnum R;
/ [! ^6 _- A. G/ F( N hugeint Carry = 0;
& b: g' A! l% y* f' f' q$ v' v, X for (I = 0; I < A.Len || Carry > 0; I++)
9 M8 r9 J& J: S/ T1 U {. m# t7 v$ ^; i$ p* `
if (I < A.Len) Carry += hugeint(A[I]) * B;
: R" ^ c+ ]0 J( k. A# |1 b( K R[I] = Carry % Base;
5 ^" }1 Z# y+ ]$ l- q: s Carry /= Base;
6 [' N, ~1 S( M U& E }6 r8 @$ t5 r8 f! y4 o4 F# N6 C
R.Len = I;
, u2 l3 r: X9 \# o$ K( t return R;7 b" T% ]+ J2 r- ~, Y* H2 `
} xnum operator*(const xnum& A, const xnum& B)' q% ?2 ?' c. |, P! P1 H
{
- q; f$ J( ^; O# L1 I, p int I;
- O ?, d# X" v) B3 ?+ K0 g if (B.Len == 0) return 0;
0 I. a; j4 i1 W$ o xnum R;
/ B( f* F( [. M$ j6 B, h; V for (I = 0; I < A.Len; I++)
/ |# c( t5 u7 V4 |* V- y5 ]& R {* \6 ?* a1 o7 V9 d
hugeint Carry = 0;; [* y6 C* o) o
for (int J = 0; J < B.Len || Carry > 0; J++)
* V% D* y1 P; n, S2 P {* d! k0 J8 Z& j4 _ T m9 L
if (J < B.Len) Carry += hugeint(A[I]) * B[J];
9 O0 R! R; V3 e" A$ `+ y if (I + J < R.Len) Carry += R[I + J];
6 a% y9 o- u* z7 u if (I + J >= R.Len) R[R.Len++] = Carry % Base;5 J% _$ ?) @) c3 Q; H6 f! S
else R[I + J] = Carry % Base;
; ]( O5 [" I2 r, K Carry /= Base;1 v- o7 M0 y* T9 f3 \
}
5 h' e h" m+ e( ~+ _6 Z1 W }9 m& T/ e! b2 `( x$ H
return R;0 h+ V3 O3 ?$ T: F
} xnum operator/(const xnum& A, const int B)
2 o: p/ Y2 r+ K) Q{) p8 Z; f5 O# K. l" `
xnum R;# T, U: f8 v3 ?7 x$ r+ F8 y
int I;
7 X6 {( J1 U0 F D hugeint C = 0;
2 Q( Q' F% f( o( d3 L for (I = A.Len - 1; I >= 0; I--)# Z! Y2 Q) j5 k1 d' i7 w
{
4 d( h) X! B* }; Q# Q0 R C = C * Base + A[I];
2 M1 {( Q8 L' a: \( u9 k0 Y R[I] = C / B;" I) q3 P/ X' R7 k8 }4 _! |+ E* O
C %= B;) R9 v# V2 X3 h" h7 S
}
7 T {4 `+ P6 y4 L8 D. C R.Len = A.Len;
, y' y) b6 k: z* T9 A/ a( W while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
% V$ X3 Z/ ]5 M$ _! W. ^ return R;8 Y U' i( X4 k) Z1 u
} xnum operator/(const xnum& A, const xnum& B). P1 W3 {& S' F% M* w( v+ W
{
; H; q7 i( U; l5 y int I;4 [! p& q* f+ x
xnum R, Carry = 0;$ w4 \8 M7 R0 N( V
int Left, Right, Mid;! g5 I5 {4 @! F8 K! R% @ N' A) U
for (I = A.Len - 1; I >= 0; I--), E% W9 L! D1 u$ M) R& l
{
. f1 k7 Z1 @9 b+ c Carry = Carry * Base + A[I];# ?- x; e! u3 T
Left = 0;7 P5 u1 T& C$ K; U) v! {$ o
Right = Base - 1;7 B7 n. c" K5 O
while (Left < Right)' z, ~, @7 M: _" u. P
{1 b( f5 }# e# {! u Z" {! p
Mid = (Left + Right + 1) / 2;) G7 B1 E3 S$ L# l R
if (compare(B * Mid, Carry) <= 0) Left = Mid;
' _- J# _* ?4 I# I* [ else Right = Mid - 1;7 F D: D7 ^& h# f( b7 X4 B& Y
}
1 Q! \' T3 E& ? R[I] = Left;
) r& }6 F7 P9 B3 S$ |) q Carry = Carry - B * Left;# C7 c, T, I+ [0 S3 H! {( J
} S1 Z# L' _2 V6 x4 b M$ I
R.Len = A.Len;0 Z5 F7 Z( D7 ]& J) n d8 }! v/ S
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
& p# \% W; k% f return R;: I9 l! F. L$ V+ X4 T: R
}: n3 a' G$ j n
xnum operator%(const xnum& A, const xnum& B)8 _% {1 b7 @8 S( R, B
{
& G" l0 O; K0 i" \- P int I;
2 B2 U% s! B7 F) Y xnum R, Carry = 0;
7 v3 E2 I! t4 A. P+ H int Left, Right, Mid;6 t* Y! }' b; W* F. K L1 [- N
for (I = A.Len - 1; I >= 0; I--). W' o: }7 V" E4 j9 O
{
N3 G1 k3 k- X; i Carry = Carry * Base + A[I];
, o% M( S' [% m: v+ V/ h% T Left = 0;
/ d- u3 b# V8 ?- @0 C Right = Base - 1;
: M% K/ e. [7 U" j7 W8 _3 ^ while (Left < Right)- i- u' q0 q6 l1 d( l
{$ g: ^2 l) q/ Z4 f8 ~) f, [1 p
Mid = (Left + Right + 1) / 2;
. d. A. a2 z# \! V; _ if (compare(B * Mid, Carry) <= 0) Left = Mid;
; A% s$ c, F1 S% |/ u& z7 o6 r else Right = Mid - 1;, B& W% `0 J0 c4 R) @% F9 s6 W
}
5 Z. w9 H+ A5 U. t R[I] = Left;1 n9 _# |+ k, s2 D1 X' Y
Carry = Carry - B * Left;- j/ ]) M# c& m. E
}
7 ~; g& b' v! J4 }. Q2 b8 E! F R.Len = A.Len;
1 U5 \ L1 ~# [/ h( ]# ^$ A( C+ g3 W while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;7 b* e* ?* ~, Z' {3 m5 K
return Carry;
3 d8 Y8 l' ~9 o4 Q8 [+ S} istream& operator>>(istream& In, xnum& V)1 ~6 l G6 \5 Z/ F
{
% ^+ H/ D# N* Q7 P- i char Ch;
6 P+ h. b2 c. U9 ]0 c' H, U& j for (V = 0; In >> Ch;)
0 L8 I; s2 ?4 ~0 B5 m {$ ?3 ^* s' ?' S" P% ?1 T
V = V * 10 + (Ch - '0');. A3 ]4 O; Y' @' g
if (cin.peek() <= ' ') break;
" \6 l( N7 e9 i5 J. g- D& F# Y. \ }& W& U& D- U |# L1 d% b
return In;
7 D, ]) }' b5 Z* Q% m4 r6 F} ostream& operator<<(ostream& Out, const xnum& V)
' v7 d' g9 w( b9 h- E9 w5 C$ c- N{: P. y- [7 c! z
int I;4 U, D& {# Y$ X7 T# s7 z( K6 E% Q
Out << (V.Len == 0 ? 0 : V[V.Len - 1]); O8 j* t( h2 \" M8 f
for (I = V.Len - 2; I >= 0; I--) for (int J = Base / 10; J > 0; J /= 10) Out << V[I] / J % 10;
" r( P1 f; u2 O7 ]# h$ o& Q7 s return Out;
; @4 G! P c4 m4 m+ u4 O! i}3 d% @9 W5 A" _: n1 @& ~
|