|
高精度,用一个线性表保存一个大整数,具体说,将大整数写成p进制数,线性表的每一项存p进制其中一位。 参考下面代码 #include <iostream>* p1 J. U2 v' T6 a( m& y6 e! p. y
#include <memory>
1 x4 T) q( v0 R* X( p7 e# include <string>& k" b L3 T+ K8 |* a
using namespace std; typedef long long hugeint; const int Base = 1000000000;% C. _# Y4 |, X' `; t& N
const int Capacity = 200; struct xnum9 X0 k1 B; O6 `) j
{3 ^: r5 s4 [/ K, W& f! T, W' b
int Len;
- k- ]7 n& z5 k/ ]) e0 F int Data[Capacity]; @8 h; e8 ], }1 R% L% y
xnum() : Len(0) {}+ l% O% b& y/ M; X- @9 x9 k
xnum(const xnum& V) : Len(V.Len) { memcpy(Data, V.Data, Len * sizeof *Data); }
, f4 ~; s `. ~2 D' ]* q3 R- U @ xnum(int V) : Len(0) { for (; V > 0; V /= Base) Data[Len++] = V % Base; } O' L) Y; ?' K# O
xnum& operator=(const xnum& V) { Len = V.Len; memcpy(Data, V.Data, Len * sizeof *Data); return *this; }, ]1 P9 m7 ?0 ?2 I: R6 y l! O4 B& F
int& operator[](int Index) { return Data[Index]; }2 u' S% i3 I# N2 W
int operator[](int Index) const { return Data[Index]; }7 c( [7 I& I: q! W
}; w& f7 x$ ~1 C; q) ]% ^! f7 [
int compare(const xnum& A, const xnum& B)
. w) |/ V2 X; S) {+ {{
6 d3 ?) @& m! W3 m9 n2 m" ^& j int I;
# }" w7 u! ]/ ^5 D if (A.Len != B.Len) return A.Len > B.Len ? 1 : -1;
. \9 t p5 R' |3 g& d for (I = A.Len - 1; I >= 0 && A[I] == B[I]; I--);) H& f6 ~! ~4 Q: a" x
if (I < 0) return 0;4 }6 r6 T, y. z3 U8 [
return A[I] > B[I] ? 1 : -1;4 x( {* ?$ S, m: h6 W! ]6 }
} xnum operator+(const xnum& A, const xnum& B)! u. z) ? A' V( d
{
* ?' {; _) x9 F7 ~ xnum R;
, i% j! U$ m' \2 \- `; N8 w: z1 G int I;$ T& y c& Q8 h/ Y
int Carry = 0;( `- n2 x8 f+ U0 y/ j
for (I = 0; I < A.Len || I < B.Len || Carry > 0; I++)! u! s( B0 l0 M1 @- A
{) c9 Z. L+ P' g
if (I < A.Len) Carry += A[I];5 x* {/ r, x# E8 X" K3 i% l1 y
if (I < B.Len) Carry += B[I];
?+ O' o& z& W C+ t3 K1 ? R[I] = Carry % Base;
# V, X, K% u- w& X/ r; |6 m Carry /= Base;
( w: R7 H( i# T }4 n4 v- {1 P4 x9 ~
R.Len = I;
1 }* ]) b6 A9 R" ]6 y return R;
( D; H6 @# _8 g0 i |/ n} xnum operator-(const xnum& A, const xnum& B)
. a; v8 s- g! z{+ U/ {, w, b: @ o' V2 _# m1 S
xnum R;. G6 M3 P+ J. E8 {8 r! _* t8 M
int Carry = 0;9 W& `* c" a! A; R) `( D' d
R.Len = A.Len;
" `4 U- j% @7 z7 g4 I int I;! ]! o1 I0 u1 H" R2 K
for (I = 0; I < R.Len; I++)
# Y8 {% z+ b) {. W7 K {6 C$ v+ V% \# F9 i4 o) v8 U
R[I] = A[I] - Carry;
8 G }4 S* B9 @, y! [9 Y6 u5 E% Z if (I < B.Len) R[I] -= B[I];
3 u$ i. |8 }7 V if (R[I] < 0) Carry = 1, R[I] += Base;# Y2 P$ g' P4 e% Z: \2 R, N2 c
else Carry = 0;
$ R: u: _/ K" K# i/ c `. q }
1 g* i( E) B( ~9 d4 Y! }& z# o while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;; e' [: J- I) o) F5 c2 v" e6 R5 j7 K
return R;1 _- @; |1 k6 ~! z/ P R2 N0 U
} xnum operator*(const xnum& A, const int B)
4 p6 M- {3 [+ U1 n7 |$ T{
* v8 F2 y! L" w0 t* z int I; n3 F' \) M: k8 b0 e z
if (B == 0) return 0;9 c) f6 `% R V4 k6 C2 H# j5 ^. ^
xnum R;$ W2 K6 G$ a9 {, {
hugeint Carry = 0;
# t- h* O$ e" m2 D0 A) N! ` for (I = 0; I < A.Len || Carry > 0; I++)* p2 x0 [! k# F
{
4 V# q, B9 {# G" c& G if (I < A.Len) Carry += hugeint(A[I]) * B;- U" x; M9 n1 H6 f
R[I] = Carry % Base;
8 d U+ p1 Q6 C' N Carry /= Base;! }+ H! N; Z* w: b$ F; o# t( ^
}/ C" l' [, g0 q0 c- f8 u9 P S) t
R.Len = I;9 C% _2 N2 L% x; _
return R;* f$ e# |7 h6 X3 {0 g" ]3 F* C4 H
} xnum operator*(const xnum& A, const xnum& B)0 u- j, v% v+ I5 Z
{3 D1 _! O; I. H+ T, [. n
int I;
# W" {- Y9 }+ b* R, v. P; ^ if (B.Len == 0) return 0;9 i- e$ Q ]! a# T* ^# p; P
xnum R;1 w" M7 K! s5 z, m2 r* a! w7 q
for (I = 0; I < A.Len; I++)% j+ V! h, j: B6 H; Y+ X
{
3 k9 k& U# f8 O" u! H hugeint Carry = 0;
0 D+ u( j1 w: A3 {3 Y* \ for (int J = 0; J < B.Len || Carry > 0; J++)
' T* | g* N9 k k9 {4 g {
2 i7 z) b+ j3 \3 b4 y7 n$ N C5 D7 y if (J < B.Len) Carry += hugeint(A[I]) * B[J];5 ~! C' n+ f5 y# h( d6 F
if (I + J < R.Len) Carry += R[I + J];
9 g) ]7 v8 ]. K if (I + J >= R.Len) R[R.Len++] = Carry % Base;3 ~) o7 T7 ^; N9 G% J! t8 l# v
else R[I + J] = Carry % Base;
5 N1 F# n% o: [- \ Carry /= Base;/ M0 S/ \; Y1 x
}
# X2 O$ H0 l! J2 I! W: z. U. q }* a4 X6 o- p9 g6 |8 E# q9 [) s
return R;& N- I3 J" R0 }2 F
} xnum operator/(const xnum& A, const int B)+ Z7 E1 b9 K- B, O- m" g7 [# C
{
% x% ?0 N. _. _1 c3 Z) d$ L3 d xnum R;
1 B- [- J9 h3 O: p. q4 g int I;
* k" h8 D1 W5 ^6 d) P hugeint C = 0;
! N: ?. {0 ?5 ] for (I = A.Len - 1; I >= 0; I--)/ A% ]$ @5 B" w1 Q' D. ^& t: q
{' |9 A& i- [2 V5 }7 G0 A4 k- N! z6 g' \
C = C * Base + A[I];
9 N) \7 C v( U* a s' [$ s1 t R[I] = C / B;
! F" O, W( B# S ?+ [ C %= B;0 j3 w* K' [, v* @- T
}
* j& F" H4 @* n8 m( |$ n9 z" ^$ z4 k R.Len = A.Len;/ W5 |# D. d! M1 G( o+ R8 `
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
$ _4 m3 u1 V! M' m ?& J+ r return R;
% {. D* Y u: Z- x$ i* |} xnum operator/(const xnum& A, const xnum& B)
4 |' i8 P8 h% w9 ]2 d3 b: Q; L9 k{
8 `; P" T5 G+ o' t int I;/ K: J' L" U; ]" j+ B
xnum R, Carry = 0;
6 d. o, ?; ~/ a; d int Left, Right, Mid;! X( [& w0 {; `* I. H9 \- n
for (I = A.Len - 1; I >= 0; I--)
, y8 ]( Y3 j, P6 c {
7 {8 [. V5 C: l9 S | Carry = Carry * Base + A[I];
+ ?, |/ P- \ p Left = 0;2 @" g$ W, P+ }1 l1 Q" l% }
Right = Base - 1;
% g8 W& U6 ^3 _ G: K2 s while (Left < Right)3 q! C: [- w" z3 S+ F
{
6 {% Z% Y" T2 x3 k1 z6 h0 a Mid = (Left + Right + 1) / 2;1 |, I* ` {% R+ n# W. l2 I
if (compare(B * Mid, Carry) <= 0) Left = Mid;. f" U& z* P6 `6 N8 w
else Right = Mid - 1;
9 b) A5 S3 z) s9 P& \* L0 u m; W }
+ f; [) j3 Z7 J R[I] = Left;
v/ T3 m/ ?; \ a F" D# V Carry = Carry - B * Left;
7 g9 k6 `. P F/ j; R' ]) `0 u0 H }
. O0 ` }, W; J1 } R.Len = A.Len;8 d$ q$ o6 y8 G2 R* e" ]
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;: _6 o! r& k- j1 A+ q/ O& ~
return R;2 H1 y$ a/ s3 b# r/ P
}1 F5 ]+ O; G2 {8 c# G
xnum operator%(const xnum& A, const xnum& B)9 [2 N9 J2 ?- O! K3 R% J
{
- g- j; D/ F* O4 t. F0 B- n int I;
! a$ C" m4 {/ ?: J/ n xnum R, Carry = 0;
. X _$ B! N/ K, e- ]' Q6 x int Left, Right, Mid;
. L' L" N5 k* d& W for (I = A.Len - 1; I >= 0; I--)
, k9 T' H% n/ Z* y {
! a/ i+ q0 w' n3 l Carry = Carry * Base + A[I];7 L! y7 K. O8 Y& \1 b
Left = 0;& |# Z! B* n8 Y( z1 H4 j5 _6 Q @' }
Right = Base - 1;( X0 u! E* P; O3 c8 r* y
while (Left < Right)
+ X8 z7 ~4 i) i+ ~% K7 J9 m* _ {& d3 r: t/ ]5 i" o& X3 o# Q
Mid = (Left + Right + 1) / 2;
/ i4 P/ L- {/ b# S& \' N9 V if (compare(B * Mid, Carry) <= 0) Left = Mid;
- F! c* Z6 O4 k3 c/ Z6 o- u else Right = Mid - 1;, {. L7 U' Y1 H$ X1 I* f! \8 a
}
3 z$ ?. m" F2 J* V' D R[I] = Left;
- H1 M; X3 A X! \/ ~- y, P! W+ F Carry = Carry - B * Left;
8 c- L# w% q3 |* D5 f$ l6 N3 I }
7 T, s4 P+ v2 ]' {0 _% ?; W7 C R.Len = A.Len;$ \- `4 }8 z5 Q) R$ R
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
M: ]5 b$ H* ~ L7 c. Q1 X6 V return Carry;
6 u9 j" C+ j5 y% M} istream& operator>>(istream& In, xnum& V)2 n, x w/ j' Q0 Z
{' ~/ T# n# n1 x4 V* X# ^
char Ch;
- ]2 B$ o" r. |# x. u. a, F* G6 {" W for (V = 0; In >> Ch;)
! M+ I6 U$ Z4 n4 z {* A2 ^. J6 s# `6 I7 G
V = V * 10 + (Ch - '0');
3 T5 A( ]& B) `$ ? o if (cin.peek() <= ' ') break;$ c4 w* W, W5 h; p0 M
}& O' s) L/ `- G+ Y# @4 m! G
return In;
# [% J4 f( R' `+ ?; I} ostream& operator<<(ostream& Out, const xnum& V): S. E, r* R' X3 G
{; W2 X$ s4 h S& k; n; l
int I;; J5 I$ j( O; V
Out << (V.Len == 0 ? 0 : V[V.Len - 1]);
1 n6 m" {/ Y6 p- Y. Q5 L4 h for (I = V.Len - 2; I >= 0; I--) for (int J = Base / 10; J > 0; J /= 10) Out << V[I] / J % 10;7 x# c3 U! {3 e5 d/ h T# ]
return Out;
( c% F+ @; m) @3 e}
5 l" _/ g( _& f% t8 E |