|
高精度,用一个线性表保存一个大整数,具体说,将大整数写成p进制数,线性表的每一项存p进制其中一位。 参考下面代码 #include <iostream>
7 u& e# l1 f& ^1 c( M+ o#include <memory>& b" H: N1 b& Z! u$ M
# include <string>
& a; j0 _+ Q1 j, X4 o0 W% T/ i) |using namespace std; typedef long long hugeint; const int Base = 1000000000;
: J g& w0 p. [0 W n2 P$ Jconst int Capacity = 200; struct xnum
4 n5 d+ ? G' Q3 @# i; z! A{
: H8 {1 y. L w0 c! T4 r( @2 E int Len;
/ d# K6 G" w$ y3 L int Data[Capacity];
% ~. u8 h6 L8 _% f- J2 o! y) x/ W" J2 k xnum() : Len(0) {}+ c9 u ?( O. N+ q) \! n9 v
xnum(const xnum& V) : Len(V.Len) { memcpy(Data, V.Data, Len * sizeof *Data); }& c7 U- @, P' B E" |& b+ N
xnum(int V) : Len(0) { for (; V > 0; V /= Base) Data[Len++] = V % Base; }
9 M# Q" e o) F9 Z2 A% i xnum& operator=(const xnum& V) { Len = V.Len; memcpy(Data, V.Data, Len * sizeof *Data); return *this; }# M" \% T) i9 \1 r D& r
int& operator[](int Index) { return Data[Index]; }# u# {; `! z4 z: a# l5 a7 k
int operator[](int Index) const { return Data[Index]; }# ?0 B) D$ l/ n4 k/ s
};
U1 m, p4 i. G9 iint compare(const xnum& A, const xnum& B)
1 ] J- j- V& K, F{
! c. i7 o0 p/ G$ F/ u# N int I;
h* Q* \1 I3 L: ]6 s) z. s' T7 P if (A.Len != B.Len) return A.Len > B.Len ? 1 : -1;6 Q5 ]/ R7 R! Z3 ^
for (I = A.Len - 1; I >= 0 && A[I] == B[I]; I--); l/ K' q7 Z% H m6 a6 l$ ~
if (I < 0) return 0;
1 ~( i7 \7 w5 z: s return A[I] > B[I] ? 1 : -1;' R5 h: S5 g6 r& V
} xnum operator+(const xnum& A, const xnum& B)
* n8 j# a3 h1 \{ v9 u" h4 k9 A/ X5 e
xnum R;" W+ ~ A: @+ a* J2 H" N" e7 }
int I;
2 `7 G! D" O+ ?/ j int Carry = 0;# ^; Q9 s; Y3 {+ }& u# B4 l8 F* Q
for (I = 0; I < A.Len || I < B.Len || Carry > 0; I++)
( g3 ^- w3 m! _6 i! M* ^ {( [: l) x% A% B! W }
if (I < A.Len) Carry += A[I];
- A% y. @ I. L& X if (I < B.Len) Carry += B[I];
4 ]* A$ p8 P$ e/ c# N% O3 A R[I] = Carry % Base;
2 v4 L: l5 Q! x; y Carry /= Base;+ t2 \9 k7 | n0 e$ |& W
} [ ~; t H. B- Z) s8 ~% J
R.Len = I;) t. O. J7 o9 P+ ^. R. ~
return R;1 ~1 I; ? P7 l8 Y5 e
} xnum operator-(const xnum& A, const xnum& B)6 _) Y2 E* r+ K- l8 R; @$ D/ m9 q! q
{ T! h) w; C. f1 U
xnum R;
8 i: O) t4 D7 R+ t. m int Carry = 0;
4 ^$ m$ E3 g) K9 N5 k0 o- ~; S/ q% w R.Len = A.Len;
& J! q' I' B6 g0 j int I;
* a$ J' {0 ]: F* a for (I = 0; I < R.Len; I++)$ `/ X: m& F3 F
{. _# e% Q5 ]9 S; E9 }! F. m# z0 A1 a
R[I] = A[I] - Carry;
1 a7 K& v# }6 m( n+ J% O if (I < B.Len) R[I] -= B[I];$ [/ ?5 v% ~% i5 @& N, q& }
if (R[I] < 0) Carry = 1, R[I] += Base;
: J* F* ?0 N% P& _* h else Carry = 0;: v2 Q7 }1 l' ^. D3 V. ]% }
}
7 @5 g1 [1 l! j- k: c; F while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--; _* h0 [3 @, d- ]: K& O X ?6 O
return R;% }. v; }& W* m
} xnum operator*(const xnum& A, const int B)
1 K/ ?% N; _# a+ g, J{0 M; l5 w) g, C& C% h
int I;
$ X2 b9 n7 B; a+ O/ f+ U& X; S if (B == 0) return 0; v( l' E$ L. M1 G2 q1 F
xnum R;/ V- @# q' h4 l+ h1 H- t2 Z. o9 w
hugeint Carry = 0;
* u4 m4 ?; E) S; i for (I = 0; I < A.Len || Carry > 0; I++); ]3 ^7 g4 I. L- ] V6 v+ v
{
% i! P2 h1 \" [1 z, {' F; S+ L if (I < A.Len) Carry += hugeint(A[I]) * B;
) T; F% X `; R* C p( q; L6 Z, } R[I] = Carry % Base;8 b! U$ M N, T& H8 X
Carry /= Base;
: t( B1 ?8 q- X Z1 l$ f* H }
. g* u( q) G8 y7 j- ^6 N: m n; J R.Len = I;
" |8 F( V, i. e) n# Z$ k& D+ P return R;3 d% t8 A/ W! w1 \$ ^! B) T7 y
} xnum operator*(const xnum& A, const xnum& B)
4 _' o5 F. M& c{
, C- [+ `) B: Z7 P/ N2 x int I;! l- F& ]1 R- W5 t, c$ p$ g. x5 Z
if (B.Len == 0) return 0;
$ Y" \, @7 t/ R4 b xnum R;
- N' F6 O2 z+ j" @7 b v for (I = 0; I < A.Len; I++)
; V! {! @. n- C0 P. N; C$ ` {
5 g/ E7 |1 ~% {1 m, ^ hugeint Carry = 0;
( }1 a: @0 t' o# F2 \/ v4 [: X# ?# A for (int J = 0; J < B.Len || Carry > 0; J++)
9 C+ z! b, x" g1 _ O2 q {
6 ?$ n0 L8 X5 U8 ^# R if (J < B.Len) Carry += hugeint(A[I]) * B[J];
7 y- m0 O! A2 F+ u; v r$ a/ d if (I + J < R.Len) Carry += R[I + J];
! o+ _7 I6 C2 u7 M0 L2 a0 E if (I + J >= R.Len) R[R.Len++] = Carry % Base;7 x+ i, v7 K1 h2 p# l0 [ m2 w
else R[I + J] = Carry % Base;
" Q4 L8 {9 Z/ M+ i- k Carry /= Base;
n( E/ f: A( d$ R8 E& Z1 V }
% K. g8 M7 l* V }
0 U% j2 D d( | return R;* \/ z" h0 B/ c% L- @! D1 Z
} xnum operator/(const xnum& A, const int B)
. g1 }) r" q! L1 J{
0 G, g" _* x0 b/ [/ P5 N xnum R;; J" o" `. l) {6 L
int I;
3 A ]: r' U. d/ g" [( q7 g hugeint C = 0;
" o4 I- C* r# B/ H6 j U7 C for (I = A.Len - 1; I >= 0; I--)
. ^ [3 B& ^; \# G& @5 ^. \1 s {9 |! r! ~7 b c. i8 C, y# d
C = C * Base + A[I];
4 }8 x) R4 g" O" M% _ R[I] = C / B;
* {. K/ t$ Z" \: y C %= B;
5 _7 e7 Q$ o( [: t+ c) Q }, r7 Q1 s6 x- `$ u
R.Len = A.Len;
! m. J) C3 `, ` while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
: P+ x; h2 S' R, [) c' c return R;( c( E, o l# _6 i1 r
} xnum operator/(const xnum& A, const xnum& B) l- p7 P' T! x$ D
{
+ e" V% C$ C# m, M! r( m' v5 T7 i int I;
% i' W& e0 I0 q; k8 v1 [ xnum R, Carry = 0;
+ o! x0 ?5 \6 B3 X7 ]7 \* i( y int Left, Right, Mid;
! X) L$ U4 c: S for (I = A.Len - 1; I >= 0; I--)
8 @5 S! S, _1 A, O$ m {
( s: I1 Z+ x8 [; T! K# \ Carry = Carry * Base + A[I];
% A' h% e( o- V5 W [ Left = 0;
" K4 Q5 r5 T5 }- d+ J; ^- g Right = Base - 1;
, q: w4 x' _# d2 @ while (Left < Right); c8 A' j, \5 W. A o, M/ z
{8 L8 z. i2 v; K7 L4 r
Mid = (Left + Right + 1) / 2;
( `# z6 J+ o4 U. p1 z if (compare(B * Mid, Carry) <= 0) Left = Mid;
. p' T& Q$ k: f* A else Right = Mid - 1;; G( i$ Z. y* J6 [+ m2 E
}
3 y8 G, T4 s: {' [8 N1 F R[I] = Left;8 L7 h0 [7 E$ a) c5 g5 m: \* m
Carry = Carry - B * Left;
: K+ T8 a, }5 c7 ^/ q: O. e }
# s1 n( d: I+ @' y2 q& G R.Len = A.Len;
6 g; @6 x8 ]; ?9 H6 y while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;0 S4 K) O4 n K
return R;: A, ~0 c: }; ^
}
# q- |7 h) D5 T2 s8 d5 B# ixnum operator%(const xnum& A, const xnum& B)
! _) Q# k6 H( F! q: B+ p{
5 s: Q# \8 [8 N O" B7 U4 y8 f int I;$ A- D3 E. I" Z
xnum R, Carry = 0;. d- c) l1 n% r
int Left, Right, Mid;
6 N. F% Y, C/ a2 U6 S7 B for (I = A.Len - 1; I >= 0; I--)9 [9 ?( T2 x% l' z
{
7 V( Y0 w8 M9 x9 y! J" M, z& q Carry = Carry * Base + A[I];
8 b4 W; c) Z+ o! j' ~, T# i Left = 0;
# n: ]( p: d# Y L, c Right = Base - 1;
; l" O2 G4 K8 D% L8 V* V& Q8 R while (Left < Right): z- y* P7 ^6 Q
{ D0 c; I4 x7 W8 `4 ~
Mid = (Left + Right + 1) / 2;) A& c+ x" k7 M6 g
if (compare(B * Mid, Carry) <= 0) Left = Mid;
$ n9 m. n/ R& O# U! {7 _4 J" H' N else Right = Mid - 1;: y# I$ n6 [' \4 K, x/ ]
}9 o$ M$ [- X% a* W- d! j7 \" S
R[I] = Left;
( ?! V s: W D Carry = Carry - B * Left;) ^, R0 l8 q; \) S( i. d
}: A1 ? q5 C7 S
R.Len = A.Len;
# R; V- S* _' ~6 Y/ {3 s while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
# n/ d0 b/ ?" O1 n( V return Carry;2 C) Q& f' _& m2 h* _( w, j
} istream& operator>>(istream& In, xnum& V)5 s5 H. h: H' Q1 m x5 N9 o
{
5 a# g @4 H, i& R char Ch;% |0 z" ]$ z4 k7 v0 R3 d
for (V = 0; In >> Ch;)
: C) V& a" [8 x8 k {6 o, e$ l7 y. Y+ I
V = V * 10 + (Ch - '0');+ {6 l& ]7 T) d
if (cin.peek() <= ' ') break;
G( K/ s. o5 K% y }5 r# @7 I! b3 T0 |' O
return In;
% W+ U8 P! _5 n, z} ostream& operator<<(ostream& Out, const xnum& V)
% ~3 }; i3 ]) x6 T{
9 ?2 Z& p8 Y: i$ _0 H8 P int I;
6 G: T5 s6 L U% F9 `( z/ Z Out << (V.Len == 0 ? 0 : V[V.Len - 1]);: b; V2 f* }8 u( D& }) B+ H2 h
for (I = V.Len - 2; I >= 0; I--) for (int J = Base / 10; J > 0; J /= 10) Out << V[I] / J % 10;
# {2 \6 c0 Z1 J$ p+ P return Out;; \+ W( |) ~+ t$ r- j/ G
}
: M7 ~3 J0 H/ k+ T5 A# f8 k3 x6 l! s |