|
高精度,用一个线性表保存一个大整数,具体说,将大整数写成p进制数,线性表的每一项存p进制其中一位。 参考下面代码 #include <iostream>, p+ c5 Y$ Q4 Q- k. v( W! _
#include <memory>
; S. x3 W7 [4 `- _# include <string>0 A( p. X# C# I3 c6 ?$ S; Y
using namespace std; typedef long long hugeint; const int Base = 1000000000;$ J6 {0 k& g: S- _: z: W
const int Capacity = 200; struct xnum
* E1 W. h7 f8 c3 P9 y{
z2 f, D4 ?) e3 S int Len;
0 U, [0 Q3 {# ~' K: S4 N2 c int Data[Capacity];. G- m/ j- l" P; C6 A
xnum() : Len(0) {}
# X y6 Z9 i7 V1 @# c/ o xnum(const xnum& V) : Len(V.Len) { memcpy(Data, V.Data, Len * sizeof *Data); }
5 V" E. I8 ^; q; G xnum(int V) : Len(0) { for (; V > 0; V /= Base) Data[Len++] = V % Base; }1 ^- @3 D6 W r, @3 s+ _
xnum& operator=(const xnum& V) { Len = V.Len; memcpy(Data, V.Data, Len * sizeof *Data); return *this; }
( l% O. J' S x8 o. B int& operator[](int Index) { return Data[Index]; }
+ t# C- L( I! U3 @" q int operator[](int Index) const { return Data[Index]; }
0 I9 {9 t- D- G/ b. o- x% s}; * L- y' ^, E% K9 t, H+ \+ Q
int compare(const xnum& A, const xnum& B)* h. R7 D! [0 L. A
{5 j$ [: X% {( E4 [
int I;( Z3 j+ z# P# \6 l6 i+ j/ z+ M
if (A.Len != B.Len) return A.Len > B.Len ? 1 : -1; K6 v' {* Y- {- k- n
for (I = A.Len - 1; I >= 0 && A[I] == B[I]; I--);
) }6 A" J$ Z$ r% X7 G if (I < 0) return 0;
$ Q3 R- a' _' |2 w return A[I] > B[I] ? 1 : -1;+ S& w& u4 u7 ]6 \& R
} xnum operator+(const xnum& A, const xnum& B)! X' O* D. t, K: c
{5 m1 g) p8 i2 w* e! ~2 F. l
xnum R;
& F7 D8 h# \, y int I;: T2 Q6 m& D2 \2 ~
int Carry = 0;
" c2 w; f) j7 b+ H* k/ |) ~; L for (I = 0; I < A.Len || I < B.Len || Carry > 0; I++)
" \) \$ g1 U0 Y+ ~& R0 J {
. h: X7 x9 L; V4 i if (I < A.Len) Carry += A[I];
/ C9 z/ T- R3 Q0 U6 ^/ ? if (I < B.Len) Carry += B[I];
3 G V9 ~2 \( _. j; o( M% ` R[I] = Carry % Base;
# I: ?- d K: y Carry /= Base;% b9 t, c H. _" m h9 }
}* h6 o0 e2 U8 o4 s8 m. T
R.Len = I;+ g8 e0 _4 b- p, b
return R;
$ H7 H8 K4 [$ c) O# b R} xnum operator-(const xnum& A, const xnum& B)
7 @3 ^; g4 N4 C6 l{
3 m# I. X# b }8 _ xnum R;2 p$ Y# p/ T1 M8 c8 ~
int Carry = 0;, z. d5 M8 S& I/ V: y% X
R.Len = A.Len;" D% \3 I t' o/ V
int I;. Y2 N; G' t; I; G$ Z
for (I = 0; I < R.Len; I++)/ q" @/ o+ J/ b$ S
{
4 n5 _. W3 |: h- g/ h) l R[I] = A[I] - Carry;
) Q O& O! }; Z4 Z, O8 L if (I < B.Len) R[I] -= B[I];2 P- x1 Y* l6 J) \: V! Z: ^# a* r6 M
if (R[I] < 0) Carry = 1, R[I] += Base;4 H1 ?' [* o9 p
else Carry = 0;- w0 x( N. d3 X4 v/ r/ e
}
; Y( v* ]6 f1 L while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;8 c% m% |# H; G! X d
return R;2 K: i; G7 o0 Q
} xnum operator*(const xnum& A, const int B)
$ r$ C Y+ ?& F: ~1 I{5 [9 R7 ~7 n# V+ s1 A; z
int I;
! o; y2 T; S0 C7 _, k if (B == 0) return 0;9 b |% T' g3 Y
xnum R;
' `, w7 V! t0 a( H2 s" S3 [2 o hugeint Carry = 0;
. W9 Y) `: E4 m( ^5 [/ L# Y for (I = 0; I < A.Len || Carry > 0; I++)+ _2 B! c' h- P
{. y7 s0 ~& P) U; [' Y) U, ` @
if (I < A.Len) Carry += hugeint(A[I]) * B;8 s2 S6 z5 H2 f* c0 `
R[I] = Carry % Base;
8 W$ @3 f6 C1 g1 u Carry /= Base; y5 V5 x' ^* W, m. }, g9 o
}( w4 m# Z1 a* p( E ~6 e
R.Len = I;
0 y4 o9 V. q0 ^ return R;" _1 j3 o0 m0 o* c+ B
} xnum operator*(const xnum& A, const xnum& B)' ?1 ?, n7 m/ H# X
{! r R- `! q0 Z) t) _$ Z
int I;( k r" i+ D V2 a# L7 z
if (B.Len == 0) return 0;2 U) U% K3 [8 @) `- g) {
xnum R;1 W$ D' ~, V& l: u
for (I = 0; I < A.Len; I++)
7 b7 p: n- y9 ~ {
' i: J; b" S5 B, g& W9 D hugeint Carry = 0;
# U1 h2 ?, q; h' b3 b for (int J = 0; J < B.Len || Carry > 0; J++)
5 B$ [- q1 C$ ~. Z; D% m7 L {
3 Y, F9 I, P1 L6 b$ O6 S% r P if (J < B.Len) Carry += hugeint(A[I]) * B[J];
5 v$ f3 c4 e2 } B8 j& H" W if (I + J < R.Len) Carry += R[I + J];5 t' ~' a- {) Y# b( T
if (I + J >= R.Len) R[R.Len++] = Carry % Base;
, i, s; M8 q' d$ N6 a( ? else R[I + J] = Carry % Base;" H+ G- d3 Z! L. M- t
Carry /= Base;
, c; @0 d0 y3 g# R2 k }
1 u; m; t5 d+ k6 D3 i; h9 A }
& T6 F; N! O3 F return R;
6 w# Q+ y1 p0 m6 N# \+ H4 s} xnum operator/(const xnum& A, const int B)
) e8 f1 P2 n7 L6 g7 T* `; B7 V{
( J* ?7 ]+ U2 z( u5 @& o xnum R;7 X* O) k* F" _8 I7 c, v
int I;- Z- A+ }" n% E) S [- r, X1 e- ~
hugeint C = 0;# H ]+ K8 G/ R8 ^
for (I = A.Len - 1; I >= 0; I--)
$ P" K8 F2 ?$ g# B8 Q {
: C2 k, S. O& ?6 X C = C * Base + A[I];+ `" O, A: x% o% [; `; x
R[I] = C / B;1 ]- G4 ~+ K. o0 m1 k, v# n
C %= B;
: @6 L i4 @: u7 @ }
# M' ~ u. k s, Z* v; B* u) e0 _8 {5 ^ R.Len = A.Len;
9 K% d; v/ A" r/ t while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;6 J& Y) i3 `+ k9 u% K1 j
return R;
% E( k2 `7 b! \/ g; t/ F} xnum operator/(const xnum& A, const xnum& B)8 ?) t0 B! k! w! u2 f
{
0 q" M' z& y: y0 ?6 {2 ] int I;
& H/ R7 a6 C E& P xnum R, Carry = 0;
7 {1 V7 }" {6 D2 O2 [( H int Left, Right, Mid;
) Y9 _* ]8 P6 E+ j$ ? for (I = A.Len - 1; I >= 0; I--)
- r$ Q: H! k6 W( y4 L T {7 B3 N# Q; K* P# X
Carry = Carry * Base + A[I];
# J: I; J! J p- o0 D6 \ Left = 0;, W& n8 j Y. C% N; b4 l9 a
Right = Base - 1;
8 ~! X1 m! `. h4 v+ m while (Left < Right)( |. e; H( k: i8 [5 T5 E/ _
{7 u& {0 D3 T5 n4 e' j. @
Mid = (Left + Right + 1) / 2;! }: [. D: _' a- @+ I
if (compare(B * Mid, Carry) <= 0) Left = Mid;0 g' j# D; A) j5 N: j) `! Z
else Right = Mid - 1;
# {$ y- G5 q9 L# Z; Y }; g, V, C5 |- P8 P9 G
R[I] = Left;
% N, \' e; O5 [4 B$ f Carry = Carry - B * Left;$ d9 H* Z8 N* y- @5 o
}' E2 [+ V, c8 W( w
R.Len = A.Len;; ^$ Z5 k* w* h8 T3 O7 w! H
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;9 P8 S" I4 o/ Q; U0 h
return R;
Y5 X% k9 O4 j; H) h: h$ i}- C$ m; w- I' ]8 `5 c- ] h# m z
xnum operator%(const xnum& A, const xnum& B)
1 c3 |% z* t" t. {{
$ [# g+ [* e+ u; i int I;
& C f) |% f+ _2 q8 I" r xnum R, Carry = 0;
! M$ _3 y6 `( B int Left, Right, Mid;
+ }% Z3 A, h- @2 [3 d for (I = A.Len - 1; I >= 0; I--): |* r0 g" h1 m) J
{. H& r2 q" Q6 d( T5 g
Carry = Carry * Base + A[I];
( K5 }' b7 B2 ` Left = 0;" |$ a6 m3 L& G. y) N4 ~! C5 f
Right = Base - 1;
- ~8 p$ [5 ~0 e' D while (Left < Right); q+ t/ K5 I0 ?/ ^0 g
{7 u: [# e+ |' u; h2 A4 n
Mid = (Left + Right + 1) / 2;
C ?* z( [; x3 d3 v' { if (compare(B * Mid, Carry) <= 0) Left = Mid;
: E/ x- \( X; N9 ? else Right = Mid - 1;
* f/ \7 d. @, d9 ~9 T6 U# c4 B }
3 {+ X; ~# X% H* a! ~2 S) n R[I] = Left;
( q$ o; F+ f" b8 R2 c Carry = Carry - B * Left;
' Y4 q& |0 n' j' h' }- g, y/ F7 m }
) |6 g% Q3 O; S& K+ i' j+ k. }0 ^ R.Len = A.Len;( R* R8 n$ B, g% z. u
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
; Z/ }$ P* X! h8 q0 N/ e* p return Carry;
! Z4 o$ T8 I" w$ J$ w1 i} istream& operator>>(istream& In, xnum& V)
4 t3 N) m3 K8 @3 ~9 A0 I{
- \9 e. t7 w9 F) ~9 p4 A# t# ?, R& A char Ch;. g/ I& y n; t9 l- O# S' o/ R7 X5 `
for (V = 0; In >> Ch;)8 ?2 o6 b2 \' H$ t! P* m
{
+ @. N% q4 Z! |; ~: E& Y V = V * 10 + (Ch - '0');
& Y2 d; x; ?& ?) H! \4 { if (cin.peek() <= ' ') break;
, d$ I e7 a, ? }. V1 E: P' i1 ^. u
return In;( g! \1 `* m/ w8 z. ~) V
} ostream& operator<<(ostream& Out, const xnum& V)
! A, o. H# b3 u3 k! y$ j{
* c5 m- b4 k9 Q3 n int I;
5 y: Z1 Z: b$ R0 v0 F K Out << (V.Len == 0 ? 0 : V[V.Len - 1]);6 {6 I5 p& L2 b( N: S
for (I = V.Len - 2; I >= 0; I--) for (int J = Base / 10; J > 0; J /= 10) Out << V[I] / J % 10;) g; a7 h w3 ` o' u' r" h2 t
return Out;4 k s, ` L9 u
}& ^% j! ~0 g! t% u" |4 b) _1 T; x" T
|