|
高精度,用一个线性表保存一个大整数,具体说,将大整数写成p进制数,线性表的每一项存p进制其中一位。 参考下面代码 #include <iostream>0 R1 P1 C: g$ P% ^+ j
#include <memory>
) g4 d9 Z1 v0 a# include <string>, h S) w* s) [
using namespace std; typedef long long hugeint; const int Base = 1000000000;
, {9 n u4 `9 a) Oconst int Capacity = 200; struct xnum
& M$ D' ?/ h1 b) M) p) G; C{0 m, y! b2 |/ Z* M0 W9 o a, L
int Len;
/ ]; G+ a1 Y2 {9 [/ u int Data[Capacity];
" w3 Z+ ^% y* _+ b2 v' t! r xnum() : Len(0) {}! f7 O/ P# |6 p- X
xnum(const xnum& V) : Len(V.Len) { memcpy(Data, V.Data, Len * sizeof *Data); }' t# {5 Y1 g) U
xnum(int V) : Len(0) { for (; V > 0; V /= Base) Data[Len++] = V % Base; }
+ ]. n. H! F5 v. W c xnum& operator=(const xnum& V) { Len = V.Len; memcpy(Data, V.Data, Len * sizeof *Data); return *this; }) Z5 M8 p) U! d, L! p- u
int& operator[](int Index) { return Data[Index]; }
. R- d. I, _/ r+ z" G0 J$ ^. u# ] int operator[](int Index) const { return Data[Index]; }7 f* ]5 \. J! ~' z6 Q U
};
3 }' F2 V: T J" `int compare(const xnum& A, const xnum& B)
6 b$ G* r9 }6 h, r. P{
2 ^: z/ f( n- A/ w1 T( e int I;: K7 { L4 N2 B; I! b
if (A.Len != B.Len) return A.Len > B.Len ? 1 : -1;
( G3 u/ ~; G$ [& Y/ F for (I = A.Len - 1; I >= 0 && A[I] == B[I]; I--);1 Z9 B, v2 L2 A. B: ~
if (I < 0) return 0;1 L0 n) w) X8 w8 T, v
return A[I] > B[I] ? 1 : -1;
; _: H; `4 M. q, [$ w} xnum operator+(const xnum& A, const xnum& B)
+ E" G Z" P3 R3 D! _- I0 G{
7 C2 k( x: T0 K6 I; j! A xnum R;
* m5 @$ Y- |4 q; b, `2 E* O int I;
& a; _3 V8 }. b$ Z% ` int Carry = 0;& V* Q+ e7 W0 V$ ]$ c
for (I = 0; I < A.Len || I < B.Len || Carry > 0; I++)0 R% X; h. R, b8 w# t. V+ F3 b
{8 S/ W5 ^' K7 N
if (I < A.Len) Carry += A[I];( R K/ I- [& ]: P f9 y
if (I < B.Len) Carry += B[I];
8 B# j- x Z' ?) o4 P+ | R[I] = Carry % Base;
2 H o5 |) o* n; z* s/ \3 ^+ G4 S Carry /= Base;
) Z0 O! f( Z) z& y/ m m$ ` h }) s0 [ ^- W* M
R.Len = I;
/ K% K, r, Y1 O" t/ y3 |. M. M% y+ Z- e return R;
/ ~. U6 H' S2 k/ W} xnum operator-(const xnum& A, const xnum& B). X# I6 G/ e+ y$ \
{* a$ O' N8 b( t6 m3 `+ w
xnum R;/ f4 X$ o5 k; U5 y7 K( N. e/ ?
int Carry = 0;4 ?) F" N R, ~2 `( K
R.Len = A.Len;
) ]' |9 |6 {/ w4 B9 d int I;
q$ h R" N, [: ~" V for (I = 0; I < R.Len; I++)7 Y+ K" Q# R4 X0 m! t5 |( ?
{& K* a" x6 y7 d0 w4 N3 s
R[I] = A[I] - Carry;
% Y8 ]; q+ I+ w# `& M2 {) _& M if (I < B.Len) R[I] -= B[I];
: J5 ]2 R+ C4 {' t/ E( d6 Y0 ^+ W if (R[I] < 0) Carry = 1, R[I] += Base;
0 ~& d" Z7 R+ ]" S else Carry = 0;
, p& t/ ]/ ^( r+ |8 X& p0 V/ P }
/ b. P' I8 K) a& x& @1 O4 K while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
0 Q% O7 V+ Q3 U( n4 [ return R;; v* [% P' e$ F% i2 u! x; K% a: Y
} xnum operator*(const xnum& A, const int B)! K' H- O* _, g' r' i- q' L
{1 t7 J5 u7 F! W- @* s
int I;
! w! s7 g" M- v. u4 [$ c' j+ U# r if (B == 0) return 0;! w* _( d9 k+ L
xnum R;5 @# G1 s8 R. C, X. c
hugeint Carry = 0;
- o3 i9 {/ B. y* v8 R# [# H0 D0 N* \ for (I = 0; I < A.Len || Carry > 0; I++)
8 \" A: v7 q3 p: q$ n {
; B0 |% w* n* @$ f6 } if (I < A.Len) Carry += hugeint(A[I]) * B;
! G2 A2 n" T6 n) i R[I] = Carry % Base;5 N" W' p& a! N+ K
Carry /= Base;/ I: E5 D* Z k T4 G
}2 a6 x' f- V( s. Q/ w
R.Len = I;+ q4 z0 O) n+ ~
return R;
P9 E. i) m: ^. p/ h" w} xnum operator*(const xnum& A, const xnum& B)
. B( ]. c' [) ]" g' U{
9 K8 _5 i+ _. |& m int I;6 F( ^1 y( M4 x( f& W9 k) m$ z
if (B.Len == 0) return 0;! r) V# ~- B' k% I. S( C* L
xnum R;# J. @: m H/ u0 O" s8 D9 i3 U/ C
for (I = 0; I < A.Len; I++)
3 I( R5 v/ h/ s0 b7 f+ L* |9 Q {
, n8 w* v% w( o hugeint Carry = 0;6 Z! b4 E: J* U& m
for (int J = 0; J < B.Len || Carry > 0; J++)
7 i! C* }0 N) y7 _4 Y) S {
9 b; l' n( X0 J9 O1 A- M5 a if (J < B.Len) Carry += hugeint(A[I]) * B[J];: _+ Q, O7 w+ \
if (I + J < R.Len) Carry += R[I + J];2 Y8 L! K: w* k. }+ i
if (I + J >= R.Len) R[R.Len++] = Carry % Base;9 F. ` g% V* }7 `) Z% o2 ]' ?
else R[I + J] = Carry % Base;( |* E/ D/ f6 R, o
Carry /= Base;
1 h7 ]& _/ g" Z1 B } 8 G; b( ]4 i% R. Z% x' Q0 @
}
0 t7 y, Q& y* a0 o4 h9 \ G return R;
! M! m6 b5 m! m) w} xnum operator/(const xnum& A, const int B)" R( S4 ?1 U I+ q) ?$ ~
{
6 ?% i5 \( U7 g# y$ Q xnum R;
3 O }% y$ V8 H9 r* C( T int I;6 A* F6 d7 A3 z6 [3 U
hugeint C = 0;
$ V+ f& c5 m0 I* b6 A" c8 \ for (I = A.Len - 1; I >= 0; I--) E! b! A/ N8 x' R
{ x$ V* k7 O: P1 i* H
C = C * Base + A[I];
1 S3 G4 t& k) ~2 F' Z5 f R[I] = C / B;
6 F& ^9 ?- P/ z8 z. T C %= B;! e/ |( w+ m3 x/ Y) p
}
/ x+ R. k1 @. J0 O( L R.Len = A.Len;! n1 c2 R" K9 j0 S% w% U$ X
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
8 K s4 e* n& ~$ m4 Q |( e return R;
$ t: G( U! r/ e$ H} xnum operator/(const xnum& A, const xnum& B)
8 H( P$ R+ q4 S7 z9 b{
- B$ W/ A! Z6 r$ n" H int I;6 l5 F2 k4 {- }8 D/ n
xnum R, Carry = 0;1 ]/ b6 c, ]. R" n4 |* y
int Left, Right, Mid;& R5 D) O& ~/ G: b8 f* u
for (I = A.Len - 1; I >= 0; I--)
# \4 k1 |: H5 ~$ G! u+ A- I {. r' D; I# J. c! C, v% y$ s `; |
Carry = Carry * Base + A[I];
8 }# L* c8 Q1 a% j Left = 0;/ \% z% k1 F% Q# ~7 B" u
Right = Base - 1;$ n, j* C! |1 T8 K) x2 U
while (Left < Right)
. s+ Q2 E: P: J, A$ `# Y {
E% U" ~0 K9 K7 a. ] Mid = (Left + Right + 1) / 2;
4 ~6 Y3 I, ?5 D7 A if (compare(B * Mid, Carry) <= 0) Left = Mid;2 h7 y+ r" {% t5 ]. `) b* l
else Right = Mid - 1;
/ m3 C; {4 ?5 f( Q* D }
0 ~0 i: V( Y2 P- {1 H& X( R R[I] = Left;
, N% m- n) u6 z! A! }) z+ N Carry = Carry - B * Left;, D; C! I; c3 a0 S' h0 h# [' I7 i0 Z3 k
}/ D R( [ C0 B6 E. U0 ?
R.Len = A.Len;
/ E5 {& b2 T+ \; L% v/ R while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;+ |& u# d0 `. b# E' s; n/ g) a
return R;
1 E6 B) Q P* f5 U* A}" c! j( Z3 D% {9 o
xnum operator%(const xnum& A, const xnum& B)/ P( e$ g# u- }# G+ s; J: C
{# F- e- c! q$ \, l
int I;
6 o4 C- J3 G. b; Y. ` xnum R, Carry = 0;8 g3 }* K7 K/ p& \2 Y4 @& C. M
int Left, Right, Mid;6 a- |3 p9 m3 Y2 v7 ?7 f$ g
for (I = A.Len - 1; I >= 0; I--); L$ q* L2 H" O* |* j2 j% H8 D
{
- z- d+ x% Z" q0 L Carry = Carry * Base + A[I];6 h; }3 b/ ?# Y: e2 F/ ]
Left = 0;: j; T$ s {/ n, X! k6 j
Right = Base - 1;
$ N, X5 r5 y0 X$ T( t n2 n while (Left < Right)( N% j. u1 U; O& g7 \# Z/ {
{) d+ Q5 _( e, W. A7 I' Y& m
Mid = (Left + Right + 1) / 2;
; ~& w1 {, u6 l if (compare(B * Mid, Carry) <= 0) Left = Mid;: ~0 g5 y! G- ~ u- j3 E
else Right = Mid - 1;
+ C$ I( ^$ n+ m E( v, A( V$ ~' S" Z& I }! N( S- d! P. U* F% A4 g' `
R[I] = Left;4 }) w, I/ I2 n' d( C- R/ \
Carry = Carry - B * Left;
& L* Z3 b' q; D0 {0 I" O% m* \* o3 l" D: @ }- x* }. ~8 G% P9 W1 g7 E8 F
R.Len = A.Len;# _: r S$ ~% f9 M/ W! U: t
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
- H/ Y& I5 Y: \7 e" w return Carry;9 W2 t* H2 v* R; E+ e
} istream& operator>>(istream& In, xnum& V)- }9 H2 g8 w8 F" M- M/ Z
{% M( H5 d+ d8 g: U# p' {7 O `
char Ch;2 A- G/ g% R0 a, c5 G6 b4 m
for (V = 0; In >> Ch;)
- q2 ]. Y/ v2 }( S {( M% E, d0 L2 I) l0 \
V = V * 10 + (Ch - '0');# F5 p+ p( B* o6 \9 u
if (cin.peek() <= ' ') break;1 W/ I" r. V3 B: g; J" S8 z9 I8 V
}
7 @7 \5 ~- i2 `9 k return In;
$ f/ R$ G7 f9 A+ P; R; u K' G: ^} ostream& operator<<(ostream& Out, const xnum& V)
Q1 K! k( ^& Y; G6 s8 {; |{# m) \" x/ v# t6 z9 T5 p7 v; i1 w
int I;
% m4 O# G* I9 i9 J3 h j, z8 i3 y Out << (V.Len == 0 ? 0 : V[V.Len - 1]);
& A; G6 y1 @/ a" P$ T for (I = V.Len - 2; I >= 0; I--) for (int J = Base / 10; J > 0; J /= 10) Out << V[I] / J % 10;' F, q+ U4 h$ V
return Out;7 I3 c. ?" ^0 M8 w' F
}
$ Q2 G4 t7 u$ A4 o" i: ~ |