|
高精度,用一个线性表保存一个大整数,具体说,将大整数写成p进制数,线性表的每一项存p进制其中一位。 参考下面代码 #include <iostream>4 T6 A9 h4 `8 Y) I! m& x3 L
#include <memory>
! u& C: Z6 W0 M' I; B7 i6 b# include <string>- @/ B+ n- L$ N& f
using namespace std; typedef long long hugeint; const int Base = 1000000000;# h# X4 t/ B( A, q1 z! ^
const int Capacity = 200; struct xnum5 ?* B# |$ H5 Y' U
{
2 F) @$ Q$ k0 L. k. P2 X int Len;) d4 z# i8 B+ Z: h
int Data[Capacity];; O7 u0 A, y( ?% q
xnum() : Len(0) {}
# \! R+ i& o$ Z$ `/ |! q6 I xnum(const xnum& V) : Len(V.Len) { memcpy(Data, V.Data, Len * sizeof *Data); }
( G9 g1 M4 h5 c/ @( w xnum(int V) : Len(0) { for (; V > 0; V /= Base) Data[Len++] = V % Base; }
- S" @, a, X& Z xnum& operator=(const xnum& V) { Len = V.Len; memcpy(Data, V.Data, Len * sizeof *Data); return *this; }
+ F% _! e1 f. ^0 @) V2 B int& operator[](int Index) { return Data[Index]; }( [( P* T3 [$ o* R$ Z9 L
int operator[](int Index) const { return Data[Index]; }6 k' c; y0 i/ X3 o k
}; 9 q0 Z [: s4 q' P) {0 r. R& Z
int compare(const xnum& A, const xnum& B)+ w5 x1 }* ^# F0 ?/ D
{
6 P7 D* n+ \4 M/ ` int I;" ~5 F( E3 G% _% K$ O4 m) l
if (A.Len != B.Len) return A.Len > B.Len ? 1 : -1;. c1 I4 [/ K1 m6 ?8 e
for (I = A.Len - 1; I >= 0 && A[I] == B[I]; I--);: |. w- u$ a: f. g% l6 m1 T! e
if (I < 0) return 0;
6 k: n" r g" D: Z6 a return A[I] > B[I] ? 1 : -1;/ B0 ?( ~' t( Q+ R$ ^0 G
} xnum operator+(const xnum& A, const xnum& B)* @; k2 N0 E) [6 f% O9 d
{
+ E6 }4 a% j5 l+ Y+ m) P xnum R;
2 N4 q* X- X6 j: K/ V( p( K% L c) j int I;
, g u5 P& {6 v( Y int Carry = 0;
9 I1 | K3 n7 |# j. G for (I = 0; I < A.Len || I < B.Len || Carry > 0; I++)( a) l9 B% u, G) R# S3 O
{
, G9 a6 a3 X$ U: A1 a* d* I* v if (I < A.Len) Carry += A[I];7 Z7 @! c; ~' J# c
if (I < B.Len) Carry += B[I];2 F- \$ w# y3 l" T) M1 r
R[I] = Carry % Base;
$ J1 T8 |3 J( y, { Carry /= Base;
, f [7 H8 F# Q Q. E0 w, H! t }% T& T& _2 j) S4 Z) l" o
R.Len = I;
. C: W! K4 e. \2 A- \2 ` return R;& F1 t' _7 c+ r" e$ M, L
} xnum operator-(const xnum& A, const xnum& B)
: B( O- B P" k5 ?{
$ A: Y7 E" N; k& F% c+ [ xnum R;
U9 m5 C0 ~2 u- T+ Y) E9 |, ? int Carry = 0;
+ a, U+ R) _ E* Y! c R.Len = A.Len;4 M- f P1 v# t( \) K. S" P
int I;" S* k" ]" ^9 O! r# t
for (I = 0; I < R.Len; I++)' i% O( ?5 P1 M- a0 M& b
{2 M2 w7 P$ M& b h$ s
R[I] = A[I] - Carry;. x W1 Z. I& j" x5 J
if (I < B.Len) R[I] -= B[I];
2 M6 |9 w" J5 @* I# k if (R[I] < 0) Carry = 1, R[I] += Base;, U2 C% K, {; f: L
else Carry = 0;
_; D/ Y! \9 j# P! u% T5 Z }
7 p7 }' V. H" b- p& j3 z while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
0 X. _5 c$ O* R3 y0 p$ [ return R;" n5 C7 }7 K8 Z# l" Y
} xnum operator*(const xnum& A, const int B)
4 Q* t/ r9 G* Y% `{
3 y1 g; D. x9 T6 ~9 {) D int I;
5 j8 l" z, Z' w' V# W9 }- S8 ] if (B == 0) return 0;
' g, v3 v+ T" K" G0 I% Z xnum R;) f5 M* t! l/ h
hugeint Carry = 0;
7 F4 p8 a% M/ x$ C9 M for (I = 0; I < A.Len || Carry > 0; I++)& T0 Q) C1 H8 J1 Q/ ]3 _4 ~* g
{! A# C! p8 w4 e0 I
if (I < A.Len) Carry += hugeint(A[I]) * B; w! X# r+ \% T" |% G( J: ], P) L+ L1 Q
R[I] = Carry % Base;5 b+ h1 S0 T5 i! O
Carry /= Base;
: N+ {7 }3 g. n }
% j* E7 [/ {$ S5 ?) ^ R.Len = I;: p1 \/ y( M2 X
return R;/ H5 v. B8 b, M* R
} xnum operator*(const xnum& A, const xnum& B)
: R! A5 {5 |- X( m3 o7 e1 @, g: |{
4 o1 C; }3 W4 y" t& a7 `$ E int I;: m6 M" [0 N( ^! P* s7 u* Z0 V) B
if (B.Len == 0) return 0;
& ]+ m5 {2 h$ b) N- n xnum R;& [$ _* P& I: \, B" M$ V
for (I = 0; I < A.Len; I++)
& m1 Q! K: N5 S' `+ { {- b6 E2 @- c! X- P# w! N5 _
hugeint Carry = 0;& _& m6 q" F0 A8 B$ \
for (int J = 0; J < B.Len || Carry > 0; J++)
4 \9 U' Z. z) T, _' P/ |9 C {
" g) }8 Q& E1 s) @# } if (J < B.Len) Carry += hugeint(A[I]) * B[J];
1 L3 y; W; j/ Y7 w |; R7 r if (I + J < R.Len) Carry += R[I + J];6 g5 e# h# Y6 B: M3 U- x
if (I + J >= R.Len) R[R.Len++] = Carry % Base;
3 k$ { g% c5 b, i else R[I + J] = Carry % Base;
}9 p Z, s! Q6 N4 H+ `% @2 i E Carry /= Base;
6 Z8 h, P9 l: o8 O+ v' Q }
1 a" X% f( r/ b6 a/ u2 ^ }
& l `& }0 X) e; x& z' x7 ] return R;
0 u X* [" S' d% t& k: ?9 p} xnum operator/(const xnum& A, const int B)1 @+ f( o' q7 }
{1 l; K2 z$ ?1 u" F( |, ?
xnum R;
! p. _) M9 B' a+ G8 o5 r- m int I;4 _$ B, V; D% s+ X- k
hugeint C = 0;
' v9 n0 n: J+ i- ~! P9 c3 y for (I = A.Len - 1; I >= 0; I--)' z7 H, C0 v/ t/ i7 Y- b
{
& Q8 z( C! |: \" O) q C = C * Base + A[I];
8 k0 E: \2 u" w- b/ p' ?- ] R[I] = C / B;+ M( `* P$ U" _ N# g0 g
C %= B;1 y( l- h" p3 `& i; B
}6 V& V9 z3 p# i9 W. S
R.Len = A.Len;
' i! Y' J6 p- h7 C! I$ o while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;( x0 t3 t9 _) ]7 v$ p
return R;7 O7 e0 W% n0 Z$ N& j. |
} xnum operator/(const xnum& A, const xnum& B)
8 H) y6 h% [# W& g{
7 w+ ~# Q! q" l: E int I;- `. o# i( Q+ L, h& v
xnum R, Carry = 0;
1 ~. L& ^6 `2 T4 f6 G7 O( Z int Left, Right, Mid;& W9 L, u2 r7 B ~8 l7 }
for (I = A.Len - 1; I >= 0; I--)
0 t. R- d/ |. [$ s, v2 G {
( |; N7 n+ b, d# N Carry = Carry * Base + A[I];5 [5 E+ Z; f s) h+ a
Left = 0;8 [! k/ Q9 X! l2 |
Right = Base - 1;' g8 g' i. l9 O
while (Left < Right): T0 l, r* x( ^
{" e! ^% y: s+ D, h n u
Mid = (Left + Right + 1) / 2;! H9 Z; y% A% |2 Z) r0 L' g) {, S
if (compare(B * Mid, Carry) <= 0) Left = Mid;5 q7 r& m6 {8 V! k: W- M
else Right = Mid - 1;
" e6 q( R9 @- c$ q }) M+ w7 v! ^! w# L
R[I] = Left;
5 A- b+ j; H0 f Carry = Carry - B * Left;& ^# L) F; B4 H. k, t; F
}
2 I1 U5 p* R8 t ?! V" E" _ u' b9 F R.Len = A.Len;
) a# n; C, w- {! Y. ~5 u0 O while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;, M$ j0 c; I6 [) U. d# D
return R;+ g& h; z' b# [
}- Z; u- @( U2 p# V' T/ S. N
xnum operator%(const xnum& A, const xnum& B)- u9 d' _" f' C) o. |2 ^0 E
{% Z$ \& }0 X2 X
int I;2 [- m9 \9 o) Q% @: o. J2 v
xnum R, Carry = 0;" ^" H! c8 m L5 g( @
int Left, Right, Mid;' N* ]! x' l& W% _" D" V- b
for (I = A.Len - 1; I >= 0; I--)! j, I. D" J% P/ S4 q" J
{3 P5 k2 l+ c) K& z5 J, r
Carry = Carry * Base + A[I];* p" y7 y H6 E1 Z! v
Left = 0;
; Y c, T5 n8 z5 B x* |7 O1 ] Right = Base - 1;
+ H( \+ g, F# U. a8 E while (Left < Right)
2 l: q3 l1 T, c' R: p {3 h% [( u& \2 b I5 h9 Q2 E. L
Mid = (Left + Right + 1) / 2;
, o9 w9 B2 ?, a+ o- p if (compare(B * Mid, Carry) <= 0) Left = Mid;
. E3 F" ]1 V% h+ ~+ z else Right = Mid - 1;# Z* r4 n8 a2 W r( Z
}: d+ ?1 ?1 ~* F5 I
R[I] = Left;
- t% r, x3 O# X8 _/ ?# a Carry = Carry - B * Left;
1 R6 n f# Q7 f& e# F) i" r4 C- E }0 P) s# P5 z) R
R.Len = A.Len;# N* [( i% Y, T* S0 v, D
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;$ H& i5 C* [, s2 m) e7 F1 j7 Y1 i
return Carry;
" D! { K0 a% r} istream& operator>>(istream& In, xnum& V)
$ F; A. h: H7 N/ b{
6 Y; L& o' u) L& ?1 G: ~ char Ch;
% {! Z6 j# y3 G1 D for (V = 0; In >> Ch;)
) i4 c" o( l9 C |* y {
z0 j) {# @4 H/ x" v V = V * 10 + (Ch - '0');6 J1 P# T) d; ] q9 N
if (cin.peek() <= ' ') break;# i* t6 O/ V, T5 J4 ^* u
}) U5 @/ N; X) ]5 S: D
return In;. {0 a; A8 W7 E% l
} ostream& operator<<(ostream& Out, const xnum& V)
; `) C7 W7 ?# b* w( w{
/ k5 q0 i' \) j/ h* L5 j int I;
2 r% M$ r' A0 R) ]) t0 I Out << (V.Len == 0 ? 0 : V[V.Len - 1]);8 I& p& T. V7 ^- l
for (I = V.Len - 2; I >= 0; I--) for (int J = Base / 10; J > 0; J /= 10) Out << V[I] / J % 10;& `" I$ ]# {8 e! a
return Out;
2 V1 r u- p& Q}
9 M9 x& ?" Z9 r: Y+ P: ~. u |