|
高精度,用一个线性表保存一个大整数,具体说,将大整数写成p进制数,线性表的每一项存p进制其中一位。 参考下面代码 #include <iostream>
. \/ `, L- a$ O0 O: j#include <memory>8 o6 d' i! e& m! h; ~5 o
# include <string>
+ _1 |) \; A" ?3 ausing namespace std; typedef long long hugeint; const int Base = 1000000000;
. s/ q. f- X* @: q( G+ a" Lconst int Capacity = 200; struct xnum
" }+ r" {* z7 d' w& F{! _% M& {2 o# E# i
int Len;# R+ ]* b* s! Y" j/ O6 l
int Data[Capacity];
# x, M9 t( L8 p& W xnum() : Len(0) {}6 E& u) s/ \; h* X* _
xnum(const xnum& V) : Len(V.Len) { memcpy(Data, V.Data, Len * sizeof *Data); }
( [5 Z& m% q- Q xnum(int V) : Len(0) { for (; V > 0; V /= Base) Data[Len++] = V % Base; }
u% D/ ?8 H) {+ x1 W. H8 ] xnum& operator=(const xnum& V) { Len = V.Len; memcpy(Data, V.Data, Len * sizeof *Data); return *this; }. d2 I/ A# x: H' ^) S8 i
int& operator[](int Index) { return Data[Index]; }3 O8 B# [" l) h& G- ^+ _1 o
int operator[](int Index) const { return Data[Index]; } v7 ?, x1 q* P# I1 `
};
1 b/ o- \. g: f8 Y$ k8 E5 oint compare(const xnum& A, const xnum& B)) N6 w V+ `7 K& n. j8 Q5 P1 Q
{ B' b4 `6 t/ M/ B3 ~
int I;; s) g6 b5 `- L0 B' k$ Z1 O; {6 H
if (A.Len != B.Len) return A.Len > B.Len ? 1 : -1;! n% g) m$ V ]! h+ a8 t s
for (I = A.Len - 1; I >= 0 && A[I] == B[I]; I--);
, r1 w: G0 f6 o if (I < 0) return 0;
) \ \) T! Z+ ]3 G% k6 Z1 \ return A[I] > B[I] ? 1 : -1;
9 b4 w& E8 n/ N( O8 p& k7 `1 B: t} xnum operator+(const xnum& A, const xnum& B)
7 Q+ Z, G# Y U7 d! `& }8 v{
, W+ U3 V9 B+ t& z1 g9 H xnum R;
# t4 Q+ g+ ~1 k+ K8 n" c7 q# x int I;- S! \3 z: ]! V
int Carry = 0;
7 Y0 @/ v4 l6 S for (I = 0; I < A.Len || I < B.Len || Carry > 0; I++)" B; a) c4 {* Y x; D
{- l; H) J3 V' C. u% e. m& q7 D
if (I < A.Len) Carry += A[I]; F1 `! ]7 e' H1 V, T7 }
if (I < B.Len) Carry += B[I];6 Q# C k, i6 g: B" W
R[I] = Carry % Base;
( S8 P4 T9 }6 n3 @2 F5 A Carry /= Base;
: m( U! s. g) M! F2 | }- O! k9 X4 |% u9 }2 j
R.Len = I;
+ `% D2 _# f' C) g5 w+ E return R;
3 _/ b$ J2 x& Q1 K! D0 [/ W} xnum operator-(const xnum& A, const xnum& B)
( e6 K" h6 Q- r0 j& s+ v{
& o3 \5 m' k* _% N% Z7 l/ k6 ?9 g xnum R;
% s8 J. J# V4 h' j; @8 z int Carry = 0; L9 Y+ u2 p. o; n1 H' G
R.Len = A.Len; p& T$ q8 G8 L$ {: ^0 K% J- E0 C
int I;
, h5 e) ^) \6 }: q0 D! Y! [% W/ ` for (I = 0; I < R.Len; I++)5 }4 h* }0 [7 F9 n, p- S9 R
{
# @& C) p6 A+ X* _" ? R[I] = A[I] - Carry;
1 o/ ]: V) [' S* n if (I < B.Len) R[I] -= B[I];
8 i; w+ n- f+ j" }9 Y- ? if (R[I] < 0) Carry = 1, R[I] += Base;' Z2 c% w3 Z+ ~4 g1 Q) w' v" i
else Carry = 0;5 P0 M$ h5 p7 V& s6 I& ~2 F0 x) _$ l
}' u& }) V* M1 W. f! a
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;2 S8 B3 k! q- S# M Q, c; }
return R;2 s# g6 p( d2 k6 `( F& ~
} xnum operator*(const xnum& A, const int B)
$ U, _" l5 b8 I- L! p a( r3 y" V{
. }* O6 _ w6 h8 \% N& ? int I;
( E0 m7 j; Q' b& B if (B == 0) return 0;
. O: E+ h1 C+ L0 j xnum R;
3 ]) c9 O2 d2 W: g1 C hugeint Carry = 0;2 [" R0 t/ b. T+ z+ G
for (I = 0; I < A.Len || Carry > 0; I++)
) Q! {$ l* W; z6 w0 u$ S S {" D9 c; |# U) Y$ C+ o' ~
if (I < A.Len) Carry += hugeint(A[I]) * B;
' Y) {/ c8 h, c! n0 p j R[I] = Carry % Base;& g; F U0 l2 b' Y
Carry /= Base;2 w$ }5 z7 t) |7 p7 d
}4 S% S; Y" K* W5 O8 z- e
R.Len = I;
! t! O$ r+ `$ H" J+ ?9 _) C5 Q$ J5 c return R;
5 K) ^ \: ]& f6 b' |. h6 B} xnum operator*(const xnum& A, const xnum& B)' R$ l( C' D& i! L7 l `# ^
{* ?8 S& D) |. k; Z
int I;1 K( g8 k& u$ A% c' }1 I9 |
if (B.Len == 0) return 0; p. t5 g5 V6 E" X! N Y) Q( n
xnum R;, @- m. U) W" y- [! T2 c" \
for (I = 0; I < A.Len; I++)- G* F' u9 L7 h! ^9 B
{
; E+ I/ ?( |: n1 S ~& z( L3 D hugeint Carry = 0;
& O- X) X& E# C/ ?5 z3 `" k8 z for (int J = 0; J < B.Len || Carry > 0; J++)# U- h( i& a! @3 i5 l
{ s' G9 Q0 \! u7 G) r+ m: G6 a, c
if (J < B.Len) Carry += hugeint(A[I]) * B[J];
( ~6 h) q+ J3 U) @7 n2 C if (I + J < R.Len) Carry += R[I + J];* U( q6 H- _5 |; Z
if (I + J >= R.Len) R[R.Len++] = Carry % Base;. l+ i! c* G$ z9 L" u8 W
else R[I + J] = Carry % Base;
' d3 g% p- @' C3 A3 N! D i( q3 f } Carry /= Base;/ h6 N- s2 |/ d) C5 o
}
+ N/ {$ X+ @" [) w; n3 f }
1 O3 U E0 z, F) T9 K9 w return R;
3 G! C, a/ d- M8 M9 e: F} xnum operator/(const xnum& A, const int B)
+ C4 q* Q ?$ ?9 ?$ u{1 u* o/ F/ T4 w" ~5 l/ S
xnum R;
: Y U3 w+ z6 N' V1 C( a0 z int I;7 a- b$ H8 K/ U5 f* \! |4 ?! Q
hugeint C = 0;2 _& n/ c# W% m4 l% E7 K- l
for (I = A.Len - 1; I >= 0; I--)) ^9 t2 J0 C4 n
{
`/ F* ^- a5 ]. M# v9 R C = C * Base + A[I];& I3 \( P/ a: i6 O$ z% f
R[I] = C / B;
* m" {+ z" T+ v6 s3 ~ C %= B;
& a' ^6 Y6 v# E( b }4 d- J5 ]) t3 W& f7 z; O
R.Len = A.Len;
7 N" V' n2 Z4 b" T6 Z& q2 z) H( [ while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;7 `5 v, M2 h/ W5 X0 }+ e
return R;
# b' T0 L* X3 J. H4 [3 K} xnum operator/(const xnum& A, const xnum& B)) C4 `/ O$ L; p8 r
{+ W4 ~2 [5 }, ], g1 K9 [
int I;; ]: I/ e w Y
xnum R, Carry = 0;) f- d: a. C) a; N& [
int Left, Right, Mid;
8 Y) \# y5 A7 ]1 ? for (I = A.Len - 1; I >= 0; I--)% d, P A4 T1 S" j n8 J$ w6 {
{
0 j+ [ a! U; B( y7 ] Carry = Carry * Base + A[I];
h, z5 j& [1 ` Left = 0;+ R% g( d! S2 C# Y( t
Right = Base - 1;" @$ p, S# {% v y3 x0 C! ~
while (Left < Right)- y( l' P. H# b; ~5 A" G
{
# d7 Z0 Z$ R3 x# ^6 R: G: O Mid = (Left + Right + 1) / 2;
* M' n) W; B( i" ]" ` if (compare(B * Mid, Carry) <= 0) Left = Mid;& Q w$ L* j; d a! l. o' D
else Right = Mid - 1;
1 G* @. ^4 R1 ^7 H8 I0 { }" F, q% g3 l9 r. q4 d9 h
R[I] = Left;% a' [7 }) j! Z& H9 a; C. f) W: V
Carry = Carry - B * Left;( s2 U- N% z: a- B& ?7 J, L- C+ D
}
5 f% O" i: a! q; v R.Len = A.Len;
0 j5 |- B4 U% d2 d while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
8 V8 y s8 c3 F1 U/ O, e return R;9 y* ~+ G! m$ p
}# j+ y2 n2 z0 B, {$ u3 {
xnum operator%(const xnum& A, const xnum& B)
# _3 d; c: x$ H{
, G% Z2 R% l @ L1 R int I;# T& o9 u# J1 t0 n2 [8 O1 Z( N
xnum R, Carry = 0;
+ u1 i5 W- Y& c int Left, Right, Mid;
$ Q/ L5 |* W/ b: c# l0 A6 w4 m for (I = A.Len - 1; I >= 0; I--)5 j/ s1 `/ u. F. E1 C+ ]
{
) P8 A: h* q7 C9 X5 U Carry = Carry * Base + A[I];
" v& p& D3 o; y7 C `: ^- Z, I# [ Left = 0;
9 [( G- x) K7 I6 v6 o! ` Right = Base - 1;/ s$ V' ]$ i P: e9 h2 c4 L
while (Left < Right)) K/ C8 Q# E% M2 I. h
{
) t1 r+ h9 I1 N. n! e5 H Mid = (Left + Right + 1) / 2;
% u% x/ m9 L/ T! @5 B. b* u if (compare(B * Mid, Carry) <= 0) Left = Mid;* n; X) ?* m+ {/ X& H6 I) V" q4 M
else Right = Mid - 1;1 h& m4 `+ w- Q& s- Y" Q! O
}! V& D* v0 `$ x
R[I] = Left; w+ H" y) A' o5 Y; N
Carry = Carry - B * Left;
: b- h4 d& }) y }& J! H/ d {0 p; w J' v3 v
R.Len = A.Len;$ k; @! F* p6 x
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
2 S( _9 }% V; C* l8 ]6 l P8 y& c return Carry;
; v8 i' z) x- Q" u6 S6 N4 v} istream& operator>>(istream& In, xnum& V)# _. K4 J6 a2 R# _
{7 q0 Y; v; E6 @" A* ^( ? b/ T
char Ch;' s& U( D; X8 M% q7 [
for (V = 0; In >> Ch;)
! Z( Y! S$ D. | {
% W g \ @; T" d' R) X5 w V = V * 10 + (Ch - '0');
6 N: ^1 i1 u6 M5 o6 b) n4 r6 X% m if (cin.peek() <= ' ') break;
! S% V2 ~4 R9 E* }5 V' g }" v, z; \, z' X* e
return In;) V1 x# w# [2 X4 U# J
} ostream& operator<<(ostream& Out, const xnum& V)0 \; q% T8 G5 d5 ]
{; A, ^/ u1 j8 m! D5 b0 f6 Y
int I;
$ I% \& x. W6 C3 E Out << (V.Len == 0 ? 0 : V[V.Len - 1]);
. ?" U: \7 m M' M2 K for (I = V.Len - 2; I >= 0; I--) for (int J = Base / 10; J > 0; J /= 10) Out << V[I] / J % 10;; h& q7 o/ Z/ o3 _$ z5 m0 r& l* W# W
return Out;
" r% ~3 F$ j5 \6 u- s# Q; J' f& m}7 q/ q& _6 H \; I- M: j
|