|
高精度,用一个线性表保存一个大整数,具体说,将大整数写成p进制数,线性表的每一项存p进制其中一位。 参考下面代码 #include <iostream>, c) {1 @- s8 y! b+ o
#include <memory>
9 U. m, O7 x* v& Y; h9 r# include <string>' I: r' c' G, B4 O
using namespace std; typedef long long hugeint; const int Base = 1000000000;5 i1 j" L- \# B
const int Capacity = 200; struct xnum
% i$ M+ c w. z7 o, Q{
1 c/ N+ y1 m; ?! J b& F$ A int Len;! U! P' P4 R( z; V7 `, w/ ~# {
int Data[Capacity];
* f8 M. }5 t% l) O xnum() : Len(0) {}
5 B3 W1 U/ R4 {3 A5 M. ~ xnum(const xnum& V) : Len(V.Len) { memcpy(Data, V.Data, Len * sizeof *Data); }, m* B: ~) w( D) l. k
xnum(int V) : Len(0) { for (; V > 0; V /= Base) Data[Len++] = V % Base; }3 x" ~# {" Y$ @- W
xnum& operator=(const xnum& V) { Len = V.Len; memcpy(Data, V.Data, Len * sizeof *Data); return *this; }, f( Y$ } H y+ h: E$ x- R
int& operator[](int Index) { return Data[Index]; }
3 T* v$ }( W' ~, W4 v int operator[](int Index) const { return Data[Index]; }3 S0 }* j& x. p# B: ^
}; # O9 P" S; H+ f
int compare(const xnum& A, const xnum& B)
! s. N' Y W1 C b* j* y{
$ \/ p4 g, ]) Z: K int I;
! }) A' u/ |- p# G. \% M# x if (A.Len != B.Len) return A.Len > B.Len ? 1 : -1;2 x4 u' G) a! J W c6 U" b! V
for (I = A.Len - 1; I >= 0 && A[I] == B[I]; I--);8 L0 e8 w3 v) O/ l% R% T
if (I < 0) return 0;5 g. g2 Z0 O' t: v& ~1 w' ?
return A[I] > B[I] ? 1 : -1;
# n1 C7 V. C" U* e8 r} xnum operator+(const xnum& A, const xnum& B)
) e e6 W4 k' Y{
9 C# ?$ ?1 d4 W. ]# S xnum R;
6 I5 F7 O& E- D+ S$ M0 a/ y int I;
: S( h3 \5 j, W$ Z& D2 y/ v, q5 ] int Carry = 0;
8 z4 ~8 F: e) g8 M P5 d% i for (I = 0; I < A.Len || I < B.Len || Carry > 0; I++)
6 _( s2 N5 n! `5 Y* w { {
* X8 S) a2 ^3 f( C+ O6 @5 ? if (I < A.Len) Carry += A[I];; T- `$ I1 S- K5 n7 n0 ~. ]) l
if (I < B.Len) Carry += B[I];
( t0 b8 h2 f9 l2 m- w' C R[I] = Carry % Base;
. M0 q! |: `. m Carry /= Base; a0 S3 L" b7 y! A' D- Y
}- ?' Q# K! | ^0 E* s" R+ ^: S
R.Len = I;5 _) C2 p# _& o' p- x
return R;9 n9 V; K- b/ E' a$ l- {
} xnum operator-(const xnum& A, const xnum& B)
3 I. X, _6 g2 W{6 U+ B3 H& P, U2 c* e% j
xnum R;" z! a* \# s( W/ G
int Carry = 0;
1 w3 d4 K4 ?3 v6 q/ T; @0 k- A R.Len = A.Len;
8 m2 Z+ V3 b* i2 M int I;% b, u" e; K G1 n
for (I = 0; I < R.Len; I++)$ X" N7 i9 t- V3 i$ Z
{- K2 o% c- J+ j
R[I] = A[I] - Carry;) ^7 C9 M- a+ _, G L2 ^
if (I < B.Len) R[I] -= B[I];
# n H4 ]; E# m if (R[I] < 0) Carry = 1, R[I] += Base;
) b% `' I% u9 o" K else Carry = 0;7 }* C& `* d3 Q; ]) I
}3 i9 K; Y, e% S$ |3 }3 K- I& ~
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;# V& o! q* \& `; S% e/ C
return R;
, v, _1 U. S# I3 Q. e" }9 c} xnum operator*(const xnum& A, const int B)& P1 K$ H, l. K d; q. f" D
{
* }$ r) E e/ n; {/ M int I;
6 Z" Z1 v) h9 m1 q; S5 t: \ if (B == 0) return 0;2 J6 g2 }, v1 W% A& l
xnum R;/ F) J& Q4 i! l
hugeint Carry = 0;
( n2 }! D& s G5 r3 c# B- j for (I = 0; I < A.Len || Carry > 0; I++), \2 p- U1 r I6 T: g( T+ k
{1 S; ^! S! x2 [8 o/ E( P% n
if (I < A.Len) Carry += hugeint(A[I]) * B;
/ |3 E- A( L! n R[I] = Carry % Base;
2 C2 e. g; S7 H! s Carry /= Base;* c; [+ S3 N- z' @+ t- d1 C
}
+ v8 P% T/ k% v u: W! g R.Len = I;
6 u! e/ b2 N: E return R;
! {1 x' t0 y0 a5 ]} xnum operator*(const xnum& A, const xnum& B)/ Z# \, \4 `) h' W' p3 q7 k$ C2 f
{
. |, {" b/ J F E( O! i4 S int I;
- K5 u: I5 J; |. \+ _ if (B.Len == 0) return 0;( K8 Y+ w: N/ Q0 f
xnum R;
2 N/ t e b' A0 N for (I = 0; I < A.Len; I++)2 S0 C/ u' h: a7 [9 J
{( {$ {: g% P N3 v' y7 P& L
hugeint Carry = 0;
6 U$ J' {3 E6 u- ?, T$ R6 E for (int J = 0; J < B.Len || Carry > 0; J++)
7 v) d( v$ M, { R" @& Q u {
$ q( B) `0 x8 c if (J < B.Len) Carry += hugeint(A[I]) * B[J];) ?$ E9 m- e' Z
if (I + J < R.Len) Carry += R[I + J];
& }: m" M, K3 Z% V. D2 [ if (I + J >= R.Len) R[R.Len++] = Carry % Base;
/ D; o. ?* T9 i* u. q/ ?0 u4 L, m else R[I + J] = Carry % Base;0 V# N: O8 W6 x0 P
Carry /= Base;4 b. k9 D# {9 ]: P- a
}
# Z# p& V" f* W8 P/ d: l( V+ m; o }8 t5 J5 y$ D- s
return R;3 `* I \; p1 M- r8 ~9 _
} xnum operator/(const xnum& A, const int B)
7 a8 u& Y1 @* m1 P/ K @- P/ V4 [0 x{
5 ?. b- o% S; F) a xnum R;
5 I3 s9 K, h8 q. r' z$ n3 M int I;8 i. M6 D# V0 N: X; O
hugeint C = 0;
[. r) \& b- j for (I = A.Len - 1; I >= 0; I--)& {/ a7 V' a6 n
{
* |, k1 w) G) }3 I2 m C = C * Base + A[I];
' Y$ o3 O/ O+ T3 _ q) h R[I] = C / B;
, }1 o K: f N! Y( N2 d C %= B;( s9 c( C. y+ @+ j0 M
}" `: N' Z/ q# \' i; M
R.Len = A.Len;0 `6 E! e/ \$ U1 Y( G- |* O& X/ F
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
/ U( } e6 ?: _! V4 S0 | return R;- z% T, [* O+ e1 U
} xnum operator/(const xnum& A, const xnum& B)0 ^7 x) }* g2 S# s: V. Z
{ F9 z, \( ~ n/ ?. P
int I;
/ A. g, t2 C3 b6 o/ ]' l xnum R, Carry = 0;* E1 ]9 H1 M1 c: |# m% w
int Left, Right, Mid;
+ f! U) _! Q B+ l for (I = A.Len - 1; I >= 0; I--)
+ e" ~& v6 I- l. v( W3 e {
2 [ P* d: N+ P1 [, N0 n Carry = Carry * Base + A[I];, ~% E* C0 u9 `1 _
Left = 0;
8 W3 A# P1 M8 ~" `; G2 k1 w! Q! s Right = Base - 1;
2 X- c! h' o; Q# J4 m while (Left < Right)
& j [$ }( m! b: Z. ?3 B. l& ` {& j9 Y/ ?$ b" N
Mid = (Left + Right + 1) / 2;
" N1 d% G$ W, ~9 B% U" M9 n& h if (compare(B * Mid, Carry) <= 0) Left = Mid;1 T, ?/ f& [) s. z
else Right = Mid - 1;) }! ~ ?% ^5 ~5 |+ T
}
! I/ F, f1 r+ a z! m$ o2 E7 f6 b$ j R[I] = Left;/ s5 l' q" C& S7 a r! n+ C
Carry = Carry - B * Left;
; L9 b; d6 q1 {! g, E# E" e+ w: { }
, W. n- p1 u+ U1 n R.Len = A.Len;6 ^- a! R g- W( L
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
. |% s' D8 E ~8 a( L% G" O5 M- R3 v return R;9 W* `8 B/ F8 l0 D6 U# z5 `$ y
}
" {+ D Q( X9 Y% v: v$ Nxnum operator%(const xnum& A, const xnum& B)
2 F7 t4 i; f$ F9 `8 Y+ ]6 H; k{6 l- v% _# X6 j* D, ^
int I;, e" S# P F2 x2 p5 U
xnum R, Carry = 0;
4 H, Y4 R, f* m. ~9 b1 I int Left, Right, Mid;. D, D8 |% o$ l- P7 ~
for (I = A.Len - 1; I >= 0; I--)0 L4 v: c, Y/ R L7 {( z! [6 |' }
{
6 s* I$ C, K' ^# R1 S Carry = Carry * Base + A[I];
0 [# I7 J/ [; D$ {" `9 S$ s- O% X$ F Left = 0;, E' g0 @0 W& | f8 N4 P
Right = Base - 1;- G- s2 r' U k% z! b1 ^
while (Left < Right)9 Y1 o2 @/ Q. v& m+ P. Z6 g
{6 ]! P5 S. k6 m4 u2 G, v
Mid = (Left + Right + 1) / 2;% _- n; s* @, u" G
if (compare(B * Mid, Carry) <= 0) Left = Mid;
" _) } L" P- y8 w1 N( v else Right = Mid - 1;0 [7 s2 _& Y% w# b
}
2 b1 z3 I y' E) G R[I] = Left;8 v6 [ ]. j1 A! X- n
Carry = Carry - B * Left;
* n& X5 G7 v! W3 E# e \3 Y: N }
6 a+ T1 P$ \4 W; z7 S8 F0 I' G' y8 r R.Len = A.Len;
. `8 m: \3 s$ o! m/ v4 D8 } while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
' t7 U ?& x6 K/ q9 J4 l3 I, t6 d return Carry;
; V- [6 u* [# r' h; ^9 v} istream& operator>>(istream& In, xnum& V)
, n; _: a- y; G{ F& T1 k- f8 u
char Ch;
7 T+ x$ q# z3 z {: S for (V = 0; In >> Ch;)
% g8 Q0 ?+ o% _9 N {- F2 [ r7 `( q3 L! D1 {, E
V = V * 10 + (Ch - '0');
, e, F: D8 U3 w- ~ if (cin.peek() <= ' ') break;
# g0 g7 m: |4 p0 }4 x/ b) I }' G8 S# C8 m+ i: g
return In;
" T- a* B: o e) I% d: ~} ostream& operator<<(ostream& Out, const xnum& V): C5 j: ^& H+ [
{
: q. p4 z) [6 |, e4 K6 H int I;
6 E$ @) H7 l: J2 t Out << (V.Len == 0 ? 0 : V[V.Len - 1]);8 z% w3 U) U( o3 r# ]) q- u
for (I = V.Len - 2; I >= 0; I--) for (int J = Base / 10; J > 0; J /= 10) Out << V[I] / J % 10;
: { Q3 ~; \& B- h' [% t return Out;( I, x3 \% T/ a n
}- A3 A5 t9 ^; M7 Q3 Q$ m6 H
|