|
高精度,用一个线性表保存一个大整数,具体说,将大整数写成p进制数,线性表的每一项存p进制其中一位。 参考下面代码 #include <iostream>
3 J( A' R. B3 B0 H! e: W#include <memory>, h$ _1 R9 B) [
# include <string>
# s7 { U. V3 Vusing namespace std; typedef long long hugeint; const int Base = 1000000000;( F% S* P1 ~4 Q8 Q L
const int Capacity = 200; struct xnum+ t8 G# i& K ?) k* O1 p
{; [# K2 `9 s% u& |! _' l
int Len;
9 J6 ^- t8 _0 \) i( z2 N int Data[Capacity];. Q) N5 I$ p6 T. j7 R( D8 M5 Y
xnum() : Len(0) {}0 T( ]7 f0 a! }1 i& K7 |
xnum(const xnum& V) : Len(V.Len) { memcpy(Data, V.Data, Len * sizeof *Data); }
V8 w G2 l3 h xnum(int V) : Len(0) { for (; V > 0; V /= Base) Data[Len++] = V % Base; }
3 {! P, O& |/ Y3 j2 u5 | xnum& operator=(const xnum& V) { Len = V.Len; memcpy(Data, V.Data, Len * sizeof *Data); return *this; }
3 w4 Y6 [8 w$ E6 g int& operator[](int Index) { return Data[Index]; }4 f$ X. Q! K% d8 M8 U# I1 [. Y
int operator[](int Index) const { return Data[Index]; }! m; B7 a9 V# o! o
};
. T) D) r% `- Hint compare(const xnum& A, const xnum& B). f+ D- F4 {' h( Y
{
9 R( o( |8 E1 J! M( q- t, D$ ` int I;
* c8 K6 j( ^! N; q if (A.Len != B.Len) return A.Len > B.Len ? 1 : -1;
8 M# N* t4 W# o r) x* t for (I = A.Len - 1; I >= 0 && A[I] == B[I]; I--);
; G4 G1 V) v) o! h9 v if (I < 0) return 0;: g7 |$ l2 f2 U, |
return A[I] > B[I] ? 1 : -1;
9 i8 _6 B+ [' R! b} xnum operator+(const xnum& A, const xnum& B)) G1 J+ K9 [: o
{
+ x& @3 M+ w" d1 L0 j: Y/ V# X xnum R;
8 d+ f6 n% I# `+ D int I;! P) @% J+ m: @' q! ^8 K
int Carry = 0;+ z9 ]+ ]6 D5 T1 I2 Y
for (I = 0; I < A.Len || I < B.Len || Carry > 0; I++)
# s# z0 T/ W: A' t/ U' T {$ f \* {( e7 S! k# C! u
if (I < A.Len) Carry += A[I];0 o/ ?6 Y& }1 x5 Z; Z
if (I < B.Len) Carry += B[I];; T! K/ Y0 Q: @$ i
R[I] = Carry % Base;
" [7 n# k$ y1 k# v Carry /= Base;
0 Z/ ]; J3 u( a: p7 g }
. _9 w( d4 Q" m; m& Q. X1 ]1 s3 } R.Len = I;8 u4 d' d( l, z0 c8 m9 }- O/ h
return R;7 l3 {( _% Q) t1 m# ~
} xnum operator-(const xnum& A, const xnum& B)- s* E, X# u; ]4 B5 z2 |9 s5 o. x
{
- a5 A8 `2 Z4 `; K. t3 I xnum R;
% v$ l: y% F. @- f7 L% `: D- i int Carry = 0;9 D/ T$ ]- `+ q& n+ J6 y _% y; ?
R.Len = A.Len;
$ b" J1 L4 j9 R$ G/ o; g int I;& a% ?2 q$ i. O) h
for (I = 0; I < R.Len; I++)5 v2 E9 X. U$ A" t# f# Z
{* r& v: ~. l" Q) T; y
R[I] = A[I] - Carry;
" s2 _. `% A( t% f* j/ H if (I < B.Len) R[I] -= B[I];& x- b; A5 P) ] t% M1 I5 _$ G
if (R[I] < 0) Carry = 1, R[I] += Base;
4 g8 o- c$ L5 u4 i) U: u. z, r else Carry = 0;' i6 U4 ?) E) o( |: Q
}1 C' y& f2 V7 N3 W/ j i
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
. B' u, O) I, ^ return R;
. t: }" B) [# M- w} xnum operator*(const xnum& A, const int B)6 C3 b# y3 W0 @; n* H
{
) g( g. ~6 K3 K6 a. D4 J int I;0 V' G! _' z: \5 i' Y$ E. Q/ e
if (B == 0) return 0;; D$ y: i; Y, ^0 g U& j
xnum R;, J4 J# [2 K) r: W+ _% z
hugeint Carry = 0;
1 Z# w5 C, w8 l4 \8 _+ M for (I = 0; I < A.Len || Carry > 0; I++)
5 |* q6 P2 C+ F/ o' g# M1 M5 f$ x3 D6 q3 ? {5 m6 O" ?8 u9 J0 V( Q
if (I < A.Len) Carry += hugeint(A[I]) * B;
/ T( [9 _8 @) k) @. S+ U R[I] = Carry % Base;
D9 \$ P3 Z+ Q$ U& ~ Carry /= Base;
: i Z* w8 ]: H }2 n4 y7 \7 J% B4 N) g2 ]2 y5 d
R.Len = I;+ P3 O2 k& _# n8 r" b" A3 u- }
return R;
7 \+ i* S. S' V; f0 ^} xnum operator*(const xnum& A, const xnum& B)
* |/ Y* h% n1 `" j% t{3 z5 R( Y6 {. o \% ?
int I;
# g% O8 F0 V- H9 v" [' P if (B.Len == 0) return 0;
4 v) B( _2 j7 t: Y3 { xnum R;, }' H) T$ h, T
for (I = 0; I < A.Len; I++)
- c% |, x; N" X {4 W# ~( R* I+ Y2 Z4 j. _" @4 A9 Z! I
hugeint Carry = 0;
7 o' X, J L) I8 @" M8 H for (int J = 0; J < B.Len || Carry > 0; J++)+ }( e5 G" Z5 Y( o: R
{
3 Q- _: a6 S7 ~3 A, s if (J < B.Len) Carry += hugeint(A[I]) * B[J];
) Q2 m- D& x# [2 t9 p, g if (I + J < R.Len) Carry += R[I + J];! \' S$ a& w/ t7 B; p
if (I + J >= R.Len) R[R.Len++] = Carry % Base;( l' n+ \6 S" x; j
else R[I + J] = Carry % Base;/ |; o% i7 f0 z
Carry /= Base;
! [$ D- o/ R) Y. K- g' L }
8 k1 ?( h4 S( A0 C: V }
! j' y1 [- Y) S- q4 Q6 E1 J' X, ` return R;2 @/ u/ l0 ~. [7 D& A& `
} xnum operator/(const xnum& A, const int B)
+ k0 D% b( }- {2 V1 @{
5 _$ S3 P$ L! ] xnum R;
4 I0 K4 ~ d9 G8 U% T1 y/ Q# O C int I;; }, E4 K' G7 M7 t8 W+ C" a+ d% w
hugeint C = 0;
- c) H: s; l/ p2 V6 P' w for (I = A.Len - 1; I >= 0; I--)
4 A. ?8 v8 ~" J' f+ h {, c! ^ _ r3 I4 O# z
C = C * Base + A[I]; R+ R) C+ D+ W$ |! ?& N/ d N
R[I] = C / B;, n/ B1 F9 Z! W' ^
C %= B;
3 | @! H! D! Z0 j! D; W# K# B }2 ?# F% ~8 i* ?) I& J: u) Z
R.Len = A.Len;) ?! v, {$ t; c' m- x
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;. b. ~% y6 n$ `8 Y" q- A: k
return R;
8 C8 D9 i: a% ?4 o2 y" |3 T1 [& o} xnum operator/(const xnum& A, const xnum& B)
% p; v" h4 o* g O. D. E# `) N{! b1 L; y$ V) F6 V& F* j) x
int I;
Z+ @8 D* X7 x1 r xnum R, Carry = 0;, B6 @3 |/ j8 a
int Left, Right, Mid;: x P: ~, `! y! n/ X: S$ z$ E
for (I = A.Len - 1; I >= 0; I--)
# G. F# D0 |! g0 S. ^& J+ I, e {
4 J. x6 p3 d Y/ U( m- V2 T% k0 ?0 j( H Carry = Carry * Base + A[I];
6 h- v ^" c! ^' p9 H! f, _ Left = 0;
2 `' k" I1 L( w) { M) q1 h0 I0 U Right = Base - 1;9 f( {- v7 T! h4 C1 n
while (Left < Right)
) R: O) L, s# n0 s: b {
$ |: x* G: w( e! x; j0 Z- L Mid = (Left + Right + 1) / 2;1 h- e5 e1 V. M) O0 A+ X6 v3 C, O
if (compare(B * Mid, Carry) <= 0) Left = Mid;: }: I1 M+ t2 ^5 p* ~
else Right = Mid - 1;
; }; B8 Q& b- G9 E' J0 |7 c9 U }
; C# ]) z7 H9 H4 R! w R[I] = Left;
+ W# C. a* n( G% v Carry = Carry - B * Left;$ |4 z' v: F' H. n" F7 y
}
' D K# O/ W& I+ f0 o7 E2 S+ y R.Len = A.Len;6 z; F* T* r. l+ y
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
$ q" q6 X0 a; G; q2 M" i( y" k4 ~ return R;# N* R( w1 B3 {9 c# h
}
3 |0 x4 ^& ]- s% t4 Q" w, f: p" g$ A' Ixnum operator%(const xnum& A, const xnum& B)
' P$ o5 S m+ R+ i* F9 j{ A9 o9 D4 a% f* y! ]. m- B& W9 k
int I;/ f; R* n- T/ \/ t- ` y
xnum R, Carry = 0;' |* s! c9 k4 M4 L
int Left, Right, Mid;+ `: n! |/ `# f( k; O2 Z
for (I = A.Len - 1; I >= 0; I--)
6 N% j) S! v x( ~# r, o% { {/ R+ u$ _% z1 O" q
Carry = Carry * Base + A[I];* Z% k* u8 K( S1 C: e
Left = 0;& I8 M! T1 t2 k4 ]$ k' z0 @) H
Right = Base - 1;" s5 C$ X3 J6 v8 N4 l/ P
while (Left < Right)
% y P g$ X/ H; J' u {
8 |5 |9 z# }' R" v6 | Mid = (Left + Right + 1) / 2;$ r8 g6 c1 w' ]5 k6 e
if (compare(B * Mid, Carry) <= 0) Left = Mid;" G: [3 v. R" n `8 t
else Right = Mid - 1;
8 ^! ~# ~* T, O }6 Z8 W5 q5 y) ]6 y5 e6 d
R[I] = Left;: y$ V; c3 Z; M+ ?; D
Carry = Carry - B * Left;
1 X1 f) n3 M' M/ |: a' X, I( u }
" w8 a$ t( t8 Q7 }: L R.Len = A.Len;
7 R& S( ]- U8 d4 X ?% a while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;* d+ P, W6 f6 H
return Carry;: V2 U' v" s# t) ?) l+ A& H
} istream& operator>>(istream& In, xnum& V)7 z* V4 r1 W% }. b" R
{8 O9 \9 M y* u* D: J$ ~7 V9 P
char Ch;" {6 |- o- C. _; i$ k4 z6 h
for (V = 0; In >> Ch;)
: Q n3 A% J* o: F2 B {
% y1 ], V+ ~: B6 h V = V * 10 + (Ch - '0');( N& R+ E/ _( C, N! g
if (cin.peek() <= ' ') break;
0 G6 E& z/ L4 k( b3 ~ }9 ?: v) Y! }! Q- i' G. r" l; b
return In;2 M l6 u+ T0 B, d- x$ H8 t
} ostream& operator<<(ostream& Out, const xnum& V)
% P& x. O) d3 U$ f3 D{7 p. r* P+ Y, m/ P
int I;" `2 E, @: r8 s5 P3 F% s+ k
Out << (V.Len == 0 ? 0 : V[V.Len - 1]);
" [+ \$ P2 D* z0 c1 M) w for (I = V.Len - 2; I >= 0; I--) for (int J = Base / 10; J > 0; J /= 10) Out << V[I] / J % 10;
, e1 P% H4 J3 N7 A* ?, ]) X return Out;
1 P' [" r3 `$ W% p( b. p/ e' R}
- q5 T9 M; x" N) s |