|
高精度,用一个线性表保存一个大整数,具体说,将大整数写成p进制数,线性表的每一项存p进制其中一位。 参考下面代码 #include <iostream>
' w# e- u* I( i9 h9 H5 {/ t#include <memory>: a# d3 b/ c, g+ t- g ~% L0 w# z8 j
# include <string>
+ l% \; Q- |7 B' D# Z: L! Q3 Fusing namespace std; typedef long long hugeint; const int Base = 1000000000;
% Q7 r, X) |. d- Y* t Y! ~const int Capacity = 200; struct xnum( w* Z& d& V V; Y% A& ]: E4 P
{
) n5 Z2 N# n! e, N int Len;
4 a" Y V& G, j0 S. ]5 V int Data[Capacity];: V% X- |9 s" O: T
xnum() : Len(0) {}$ k: r3 h6 z. R* c6 _, D1 M
xnum(const xnum& V) : Len(V.Len) { memcpy(Data, V.Data, Len * sizeof *Data); }
$ p4 E2 W! O3 @ xnum(int V) : Len(0) { for (; V > 0; V /= Base) Data[Len++] = V % Base; }
2 i; x* f9 G6 o xnum& operator=(const xnum& V) { Len = V.Len; memcpy(Data, V.Data, Len * sizeof *Data); return *this; }
P e; g, s, L int& operator[](int Index) { return Data[Index]; }
/ _3 H0 x( f9 _% l/ T% p int operator[](int Index) const { return Data[Index]; }
, z* z) R: h$ F) Z) T( x: J5 A};
9 P' Z% C$ @- ]1 Y6 T& Jint compare(const xnum& A, const xnum& B)& A1 y. Q' p% M, K. O9 j4 B
{9 g) G1 [% v2 ]' w9 o8 q
int I;1 \5 d0 z. |0 P& y8 O
if (A.Len != B.Len) return A.Len > B.Len ? 1 : -1;" a0 k3 ^* |5 p- |6 K
for (I = A.Len - 1; I >= 0 && A[I] == B[I]; I--);
* V' c6 ?. j" g. _( ^ if (I < 0) return 0;$ g& G, Y6 J! o# Y5 \! ^0 o
return A[I] > B[I] ? 1 : -1;: n2 R& h* i. G N/ a8 t
} xnum operator+(const xnum& A, const xnum& B)
' R3 j/ o; v. L{, s+ J0 L5 ~$ q; z. t, h# j+ H
xnum R;& M+ }- m3 D. `2 S# I+ C
int I;
# Y- X) j8 x9 @ k8 e int Carry = 0;5 [* h& X9 l: |' N$ F ^5 R
for (I = 0; I < A.Len || I < B.Len || Carry > 0; I++)
/ O& M9 \# N" p {
$ S- Q: }+ F& ^1 r$ V if (I < A.Len) Carry += A[I];
1 L! C, [% E2 ] if (I < B.Len) Carry += B[I];: B3 m4 U' B% \: |1 C, A$ x5 P7 \+ G
R[I] = Carry % Base;
( i; s* @' r7 z: D1 c Carry /= Base;9 K v2 k9 m6 T7 y( w
}* h" |- Q4 ]' s, {, H
R.Len = I;
2 M* H4 d2 s: g- j return R;( u6 w5 J3 F& m1 y
} xnum operator-(const xnum& A, const xnum& B)
, K4 N) b8 }! Z- D{5 V+ C4 Q. ] J& S
xnum R;8 u7 s U4 N% \( i; D L" D F
int Carry = 0;$ ]8 s9 k+ X4 X# h
R.Len = A.Len;
8 p" q# k+ G- C" j- e3 M int I;
, Z! H! b) l! }% }* E for (I = 0; I < R.Len; I++)% u; k* H. _7 ~3 G) \1 ]4 j
{
5 {1 I& w) K+ q) d R[I] = A[I] - Carry;
+ P# f' ^6 h3 F+ k2 ]% t. C if (I < B.Len) R[I] -= B[I];: ?$ d5 d: u @. o( Y
if (R[I] < 0) Carry = 1, R[I] += Base;3 m. e% c# Y( g+ S" C/ F3 A2 k8 t
else Carry = 0;( Q/ `/ Y( O0 D* u/ j- }3 A. W
}
- y7 Z, J% r( o while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
- u' o2 }: A7 ?& I. o/ e- E6 b return R;5 h) T$ R* f# W. ]7 B2 g2 w! |
} xnum operator*(const xnum& A, const int B)- \2 a0 `1 B4 c* f6 C: S) z
{
8 J+ }& J+ A+ m, |" S6 A4 s8 b2 o int I;
5 t# B5 S- [% x if (B == 0) return 0;
- K( ?1 k( T5 y1 e$ _1 q; I xnum R;5 t' Z6 a2 E- z
hugeint Carry = 0;8 n+ h! `- V8 ^; T
for (I = 0; I < A.Len || Carry > 0; I++)' k& J Q$ I! L
{
" y* ]" R$ w0 k6 l0 R* p if (I < A.Len) Carry += hugeint(A[I]) * B;
8 H3 u8 t0 _0 [& E: L R[I] = Carry % Base;& `. F7 R0 c {
Carry /= Base;
7 q$ ]/ h* o8 q. h) G3 \ }
6 d, q9 K8 D" H& z0 Z. E* P4 g9 ?- b6 X! m R.Len = I;5 { Z) y' S) b
return R;
/ z; N- S6 l# V) K} xnum operator*(const xnum& A, const xnum& B)
% e/ C/ x9 U9 `' S" S{
7 ~6 x* m2 u4 N5 O" S3 C: ]3 Y2 m int I;) ], z0 g# C+ @ G# f
if (B.Len == 0) return 0;
0 a! p( l \8 m( O xnum R;
1 c. F% q% V5 O for (I = 0; I < A.Len; I++)
* G( Q( l* {' }, z& r {3 w4 g4 x& P+ i
hugeint Carry = 0;
/ f" H/ H3 o: L' Y X" m for (int J = 0; J < B.Len || Carry > 0; J++)
* {( H; R# I& d5 c7 E {1 `4 I- k3 E7 c" l4 Q0 Z9 N }
if (J < B.Len) Carry += hugeint(A[I]) * B[J];
. C3 f. T$ Q5 ~/ W& ]2 N if (I + J < R.Len) Carry += R[I + J];
! U/ b9 L" I) L' i1 J if (I + J >= R.Len) R[R.Len++] = Carry % Base;
/ o1 [4 K5 X/ ]$ ]7 M else R[I + J] = Carry % Base;
[; H* r# y* k/ [" \6 R' ? Carry /= Base;
. T, {7 @; ^5 @3 q } ! M5 }+ y2 \/ {' X
}
) K q) Z1 W0 {9 h$ l return R;; _; g0 Y* @6 ?7 y( P& e
} xnum operator/(const xnum& A, const int B)# C# v- `8 m3 j; z% q& x2 }2 H
{4 B1 f5 q, `- k) ]# `' S
xnum R;/ M4 i0 D& B! W! O T
int I;
! j" n0 R+ H4 ^. ` hugeint C = 0;
, V5 n3 [6 J2 M+ ~; v1 s# p/ e for (I = A.Len - 1; I >= 0; I--)2 C- K5 X q7 @7 m4 R: e
{. Y, x2 [' G. V" \9 L
C = C * Base + A[I];
* I3 z5 k+ |! y$ y \8 D2 n R[I] = C / B;# N" G2 Z8 N' y8 G ^; ~0 X
C %= B;
5 Y6 v4 ~/ a& f! K) @6 M }7 z4 d7 b- H$ c. l8 Q5 F. v+ i: b9 N9 ~
R.Len = A.Len;
5 j! |3 d2 U0 }( D2 U while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
6 c& ?: y' Q: W, c% s return R;* P2 Y; ]6 B% C7 e: ]3 T: w1 @$ `
} xnum operator/(const xnum& A, const xnum& B)
' d5 H) g( E" O{1 `. W0 k. q0 ?( `! I1 u' D0 g u
int I;9 W) f- T- e9 n1 L3 j: P1 D$ W
xnum R, Carry = 0;; O( k% K' E" ^
int Left, Right, Mid;
& N4 i' e* J" p9 s7 b) M for (I = A.Len - 1; I >= 0; I--)8 f% N5 W6 W: ^: E% Y
{
- R- m! I. g7 X( A4 E# V" x Carry = Carry * Base + A[I];
$ e% b8 A: X8 z+ n% j Left = 0;8 x- Z$ ?2 \7 H: s A& q
Right = Base - 1;- C" Z4 c9 c) b+ j) a. {
while (Left < Right)% B0 a& Z4 Q! r) @5 k
{
8 I3 P* j- D3 b, ^* E9 j/ T3 M Mid = (Left + Right + 1) / 2;) I: G% Q' d. @
if (compare(B * Mid, Carry) <= 0) Left = Mid;; b ?5 i2 {: x; A
else Right = Mid - 1;
# I8 z, j! A: ? }
0 @ g( J) x, I* ~2 } R[I] = Left;, x' V! s0 ^8 j/ e9 _; ~( n
Carry = Carry - B * Left;
0 e9 `0 P ~. W- G4 q }
4 K* b3 ]1 }: y( h8 L R.Len = A.Len;
4 ~- H8 O/ m. C3 A while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;. i! _3 D& \' j7 }' N/ R+ L
return R;
/ R" \1 Q( S+ ?}. R c6 b0 `9 ^6 p f# @
xnum operator%(const xnum& A, const xnum& B)
$ I+ R5 r' N$ ~) w1 W1 Y! j{ w8 H8 s+ K7 s; y( t: c
int I;( a2 ]# a( V' C' Y% r
xnum R, Carry = 0;
5 G# s6 T9 \) q" K) v# k5 ^ int Left, Right, Mid;& _- f3 f0 y# k g Z& I
for (I = A.Len - 1; I >= 0; I--)
1 X# T# R" P/ ~3 _, U9 ^ {
+ h* W. ?$ v5 Y* N. v) Z Carry = Carry * Base + A[I];
0 x) w( F1 A. x% q" c8 w6 ?* p/ x Left = 0;+ Y6 k s( H4 u" |1 v$ N- C P
Right = Base - 1;% w7 l; ^3 x* L4 W4 J$ c
while (Left < Right)3 m1 Y$ h4 f# q2 |$ Y. p5 _
{
m; [; ]* b& m Mid = (Left + Right + 1) / 2;. a& }" o& ^6 [* D
if (compare(B * Mid, Carry) <= 0) Left = Mid;
4 g* S9 @: G2 Q( O0 k else Right = Mid - 1;1 k# H* m2 h0 N5 s3 ]5 q
}
4 ^; n7 \6 n! Y* {) k1 U F- C R[I] = Left;( w/ G! K4 R7 ~$ p( I0 @" m
Carry = Carry - B * Left;$ P q- J! m. {; d/ d' h
} C5 p! a1 I# t3 L
R.Len = A.Len;" X+ \; n2 v U3 X3 d
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;* t. u+ _/ S# M6 Y2 _' ~
return Carry;' V6 p0 ?$ \( N. S4 \! o+ Y
} istream& operator>>(istream& In, xnum& V). z+ I- d4 {/ e Z3 t0 r3 S3 u
{. {# s6 V6 }/ G- o0 ]
char Ch;8 o3 r7 [+ x1 M& D& {) A
for (V = 0; In >> Ch;)
l/ s8 l2 c- Q0 z8 J* A {9 N; h/ a- R$ ~: y. W" i! C7 h- ~
V = V * 10 + (Ch - '0');4 k4 c& G7 i: l8 I/ u: `7 d! f6 |' J
if (cin.peek() <= ' ') break;
3 O* _# D5 n; \. Z6 Y }( J' p: [4 p! I1 r/ m
return In;
0 r" r3 s1 ^8 ?$ @4 f} ostream& operator<<(ostream& Out, const xnum& V)9 ]$ B- S: `2 b& K0 r: j( p! |
{
+ I* E+ \( j: \9 n' O int I;" @2 P% j. F3 O! x0 b& i+ D
Out << (V.Len == 0 ? 0 : V[V.Len - 1]);% R! F$ d" i4 P1 e
for (I = V.Len - 2; I >= 0; I--) for (int J = Base / 10; J > 0; J /= 10) Out << V[I] / J % 10;& Z2 L: y/ H0 `& i" B" A- X2 i
return Out;
* g2 {, F: _+ Y/ B& v( ^}
. Z+ R6 V+ _; i' ~/ t6 D& b |