|
高精度,用一个线性表保存一个大整数,具体说,将大整数写成p进制数,线性表的每一项存p进制其中一位。 参考下面代码 #include <iostream>
' k [& H6 B; ^#include <memory>
3 ~8 j3 q4 l0 I5 s2 ]; ?# include <string>! ?1 r; N& w" h3 c) N+ p5 m
using namespace std; typedef long long hugeint; const int Base = 1000000000;" m: R) w% F: o% Z: S
const int Capacity = 200; struct xnum) M# G4 }0 J- F8 W5 a% I( Y8 z
{
. @" ?! V- C4 W9 P" r int Len;3 b$ x; s& X0 Y. e9 c) @
int Data[Capacity];
! u; c7 {3 D4 N* A: y; g# v xnum() : Len(0) {}
( _1 r' n; J2 E0 D" K6 V1 F xnum(const xnum& V) : Len(V.Len) { memcpy(Data, V.Data, Len * sizeof *Data); }
- z/ J. H/ ~( a3 U% S xnum(int V) : Len(0) { for (; V > 0; V /= Base) Data[Len++] = V % Base; }( k7 B2 m* @$ g6 @* o+ j
xnum& operator=(const xnum& V) { Len = V.Len; memcpy(Data, V.Data, Len * sizeof *Data); return *this; }
% }& w# o- X% i: v* U$ d int& operator[](int Index) { return Data[Index]; }9 n& B- _- D- t" X
int operator[](int Index) const { return Data[Index]; }3 B: Y( M& P' _' b, ]: f, O: f! J
}; 7 k4 C% X& [) u- F: I- z3 V2 V' X
int compare(const xnum& A, const xnum& B)
3 [ x2 z# ]' \6 t8 `1 ]3 ?- V& v1 b{
! G, |0 ^* I) ]& t& G# z) B int I; ?3 {% x6 h% K B
if (A.Len != B.Len) return A.Len > B.Len ? 1 : -1;
+ J( D2 W o' h s( O for (I = A.Len - 1; I >= 0 && A[I] == B[I]; I--);3 t" m( `( l6 K! M f+ h
if (I < 0) return 0;% c E5 Q- h# y& ~' E
return A[I] > B[I] ? 1 : -1;
/ \% E: {' q2 F0 m. d3 t9 Y/ n' }} xnum operator+(const xnum& A, const xnum& B)
) i9 b2 ]7 \" E8 e* p{
( ?" \5 w# M6 E" ~) t& K# D4 [ xnum R;6 X0 c4 x6 v5 ~7 N& f) z% j
int I;% }# X7 U6 _2 }# H- E4 a+ I
int Carry = 0;, Z7 r2 e9 G2 n6 D) i/ ]- r* N1 P
for (I = 0; I < A.Len || I < B.Len || Carry > 0; I++)
5 _6 T r; \3 m5 ]9 D+ r$ J6 Z5 ~ {
1 y" x2 h' R6 f0 d if (I < A.Len) Carry += A[I];, i1 _5 G) i! _) v9 @8 D1 w* s/ r
if (I < B.Len) Carry += B[I];
+ F3 ^+ }7 N2 {, g- M6 B, j. B# u R[I] = Carry % Base;
# F4 V7 Y; w8 I5 u Carry /= Base;, d2 q/ P6 e1 U" M7 P
}; q) K" L8 r3 S0 i
R.Len = I;: c! c1 Q0 x. {: l" ]9 p
return R;
5 c4 |. _. C) G& e! n) g- `0 B} xnum operator-(const xnum& A, const xnum& B)
, [! @8 k+ G- @4 G2 u$ m{
% }* a, @2 h8 l& p& H# Y4 X xnum R;: M" x6 J1 O) j) y
int Carry = 0;0 K* M$ P1 U4 S8 s$ x* r& Q
R.Len = A.Len;. p7 X7 | \0 U, o
int I;& F8 n* o$ L8 I, M& G0 c% T
for (I = 0; I < R.Len; I++)) q5 _" K/ S6 u
{+ x3 d" b6 W/ c1 e1 M3 `9 R8 s
R[I] = A[I] - Carry;- l% P+ U4 }$ H
if (I < B.Len) R[I] -= B[I];! z- X( H! @3 g! S- w7 v
if (R[I] < 0) Carry = 1, R[I] += Base;7 i# ?- D9 m) Q% u
else Carry = 0;
6 }7 ^6 Q1 L3 `1 @# O! L }7 V5 W& w: z9 g7 S2 e9 u7 C9 V
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;2 Y2 @) B. N/ v
return R;
0 D" V" J+ U" O} xnum operator*(const xnum& A, const int B)8 E# m! l/ n: K" L$ a
{# h. U- ~) ~1 p# I1 X
int I;
9 J% ?2 s( }& G" d8 K0 s9 b8 x if (B == 0) return 0;+ v0 F% `6 o/ w. n! k
xnum R;1 O+ A4 X+ |9 i# n. A
hugeint Carry = 0;
) a3 }+ U' I% h for (I = 0; I < A.Len || Carry > 0; I++)8 T8 E$ E: j0 K0 ?. A
{
/ J7 E5 n$ D9 S if (I < A.Len) Carry += hugeint(A[I]) * B;6 U5 K% n. q T$ j0 X. C1 G
R[I] = Carry % Base;% T1 ~ Y# M# Q) m& k b& T& E: M
Carry /= Base;
& X/ I+ @0 T5 J }
' j3 U8 k# B6 y) [, }/ I R.Len = I;
* E G3 `- R0 P' x6 ]$ j return R;
& B' R3 x' Q5 {4 O} xnum operator*(const xnum& A, const xnum& B); @: j& Y2 y/ i# ?( V
{# Z0 d9 {# z4 Y) x7 U. j2 ] k
int I;
0 X# [" K- a( f3 P2 W6 Z" X2 v if (B.Len == 0) return 0;& V" R) L" L* D5 i; J+ F
xnum R;$ p# \6 m" }6 t/ _
for (I = 0; I < A.Len; I++)+ g) T3 e# u+ H' R% Y# l
{
: c0 E; V% Y. U' O# j+ Q/ R* I hugeint Carry = 0;, M& s. x8 N' q* u
for (int J = 0; J < B.Len || Carry > 0; J++)
, P5 G$ Z! ?2 K# ~ {2 D- t4 E% b$ w
if (J < B.Len) Carry += hugeint(A[I]) * B[J];
7 w" Z+ c# T% W7 j if (I + J < R.Len) Carry += R[I + J];) M& I/ a; k& b' @/ z
if (I + J >= R.Len) R[R.Len++] = Carry % Base;
; f& O2 z- e& D" l+ k else R[I + J] = Carry % Base;9 q' ]* q' r [) Q! {# o" {6 t
Carry /= Base;! Q: C6 Y; }0 ]& q7 q8 g$ |3 ~3 B
}
* S' }0 a9 R5 F3 h, J7 Y/ J# Q }
1 E2 ]: T7 w( ^3 [' h5 p return R;: V6 a. _: E" x3 z: a$ Y9 D
} xnum operator/(const xnum& A, const int B)* p, S# ?+ M" D2 c, j0 [
{
) }; c x( d) N! X3 x, S xnum R;
' b6 g5 e+ V' l5 u# o1 a int I;" ?2 @1 I# E2 Q1 _+ V# |" r/ B
hugeint C = 0;
' [) \, T( ~# o+ @. p( a4 x! p for (I = A.Len - 1; I >= 0; I--)
/ p$ u+ m8 H/ m p R/ p: I) p {3 ]$ I5 `% m( @+ c9 `
C = C * Base + A[I];
: ` T$ s- }2 H5 N# Z R[I] = C / B;
- W1 Q0 k. {8 |9 Q _) i9 { C %= B;
% E- A7 n+ |. T v$ Q5 Q; C# o }
6 [9 t: C7 i0 [$ e0 ^" s2 M | R.Len = A.Len;
' R& Y% Y+ a& s7 Q- J while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;/ u( n6 d' d' Z1 l+ T
return R;' x2 |9 \0 p( ?5 B
} xnum operator/(const xnum& A, const xnum& B)
+ m, n8 K( T& _7 {{
: [' U. I) N9 `$ @" |- A int I;$ _8 l# M, \ m' m
xnum R, Carry = 0;
, Q# u/ Z& x# w; x int Left, Right, Mid;
; K" H$ `) G" n3 q for (I = A.Len - 1; I >= 0; I--); P% v2 `1 j* w! H
{ @& y/ T: Y: S5 F, B/ y U
Carry = Carry * Base + A[I];, [. `2 X8 z0 C+ {) T- @' G
Left = 0;% R2 K& d1 z' G/ w0 N* O, p
Right = Base - 1;
* S2 s7 |8 ~3 }, b2 O A" C% j9 J while (Left < Right)
5 r+ c' v; P9 h' N# Y: N+ [ {- `5 F; j2 b3 X1 \
Mid = (Left + Right + 1) / 2;
$ J, j- F- V5 x, n/ X- f& @ if (compare(B * Mid, Carry) <= 0) Left = Mid;7 ^0 I) [: l; d4 I) [6 T! O# C- x
else Right = Mid - 1;5 T- r4 \$ K i' {+ f
}
" q$ b$ @( g' e: k B R[I] = Left;
( z$ B& R3 _' @1 n5 @ Carry = Carry - B * Left;
0 O" z0 Q6 E! a8 F/ k+ l }
" Y1 p L. M7 B8 _/ ` R.Len = A.Len;
N4 ]: D" f8 c6 E0 U' M while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
0 f- ]6 M9 e1 b- [& A% \ return R;1 X: R2 `, m2 e( h$ L% U2 H9 _
}1 U( E Z: f; a# _1 G
xnum operator%(const xnum& A, const xnum& B)- e* ~5 Q" _0 b( s0 s
{7 H9 ^! ]8 N0 C! W. ]
int I;% |! H9 n& d) ~
xnum R, Carry = 0;4 s/ t$ a. D! J$ w7 l1 w
int Left, Right, Mid;
; R4 @4 O( v# @$ | for (I = A.Len - 1; I >= 0; I--)# N9 D" n; `) W
{6 G; Y6 C! b3 |. d
Carry = Carry * Base + A[I]; k$ W* c% q0 e% ~; ^+ [+ k
Left = 0;( U# R" q$ }; V# R
Right = Base - 1;
( |0 D" C! ? q% P while (Left < Right)
" L. _- S/ a8 X* k- [ {
$ D! h9 C- F/ D6 f- H Mid = (Left + Right + 1) / 2;
6 j% i# V P6 I" ?' B! } if (compare(B * Mid, Carry) <= 0) Left = Mid;4 y" I' l2 F+ W' m. I, ]
else Right = Mid - 1;# y, _* F- ~( D7 O G2 F9 i
}0 i4 f' j) t% ?
R[I] = Left;' K! W% T) w% f( s. J; s1 x
Carry = Carry - B * Left;
: g8 Z* l( ]5 k) ]# T }
' n& C5 D7 i* R% g/ x y" f% w, b R.Len = A.Len;5 [! i4 R6 s/ t# m* f2 q
while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;
2 [$ Q4 e) v" ~* m! R/ { return Carry;
, N0 c- r* m: j} istream& operator>>(istream& In, xnum& V)
+ Y6 w7 n; V2 F0 `3 R' x% s{ n2 S- O, `' {2 c: ^: l0 _
char Ch;
# A& `- q$ R8 h( D9 o/ I for (V = 0; In >> Ch;)
" s; e: F3 Z" R! [ {
" C) k, q& c2 n8 q1 D V = V * 10 + (Ch - '0');- w/ i, S; U' K/ ~
if (cin.peek() <= ' ') break;
! f7 _; f3 |9 J% w! G, q0 v }
# q7 R1 Y9 j4 t2 a" O9 Y+ U return In;
* j% ], L6 u; j' O% H} ostream& operator<<(ostream& Out, const xnum& V)
: P3 C% ~* Q+ _& O7 I{+ \* w6 y0 P3 R9 i3 C$ Q
int I;2 E4 k* @4 a3 B+ s
Out << (V.Len == 0 ? 0 : V[V.Len - 1]);
; K: @6 u2 F! t( c3 k for (I = V.Len - 2; I >= 0; I--) for (int J = Base / 10; J > 0; J /= 10) Out << V[I] / J % 10;
6 C$ ?: m+ g" g! f! |- H4 E- k, f8 P return Out;
1 X( s5 R* }# k& J Q$ p1 P}
- h0 P+ a4 R. A. k7 Q |