QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3638|回复: 3
打印 上一主题 下一主题

谁有超长整数运算的好算法?

[复制链接]
字体大小: 正常 放大
xuefu998        

1

主题

0

听众

49

积分

升级  46.32%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-2-1 16:07 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

谁有超长整数运算的好算法?

3 {# l0 H9 Q7 G5 b" J" B. q

现在CPU还是64位的,量长整数不过int64(2^64),超过这个数的整数怎么办,如1000!等,请各位有心人指点迷津。

[em08][em08][em08]
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
aftermath        

0

主题

0

听众

49

积分

升级  46.32%

该用户从未签到

新人进步奖

高精度,用一个线性表保存一个大整数,具体说,将大整数写成p进制数,线性表的每一项存p进制其中一位。

参考下面代码

#include <iostream> 7 u& e# l1 f& ^1 c( M+ o#include <memory>& b" H: N1 b& Z! u$ M # include <string> & a; j0 _+ Q1 j, X4 o0 W% T/ i) |using namespace std;

typedef long long hugeint;

const int Base = 1000000000; : J g& w0 p. [0 W n2 P$ Jconst int Capacity = 200;

struct xnum 4 n5 d+ ? G' Q3 @# i; z! A{ : H8 {1 y. L w0 c! T4 r( @2 E int Len; / d# K6 G" w$ y3 L int Data[Capacity]; % ~. u8 h6 L8 _% f- J2 o! y) x/ W" J2 k xnum() : Len(0) {}+ c9 u ?( O. N+ q) \! n9 v xnum(const xnum& V) : Len(V.Len) { memcpy(Data, V.Data, Len * sizeof *Data); }& c7 U- @, P' B E" |& b+ N xnum(int V) : Len(0) { for (; V > 0; V /= Base) Data[Len++] = V % Base; } 9 M# Q" e o) F9 Z2 A% i xnum& operator=(const xnum& V) { Len = V.Len; memcpy(Data, V.Data, Len * sizeof *Data); return *this; }# M" \% T) i9 \1 r D& r int& operator[](int Index) { return Data[Index]; }# u# {; `! z4 z: a# l5 a7 k int operator[](int Index) const { return Data[Index]; }# ?0 B) D$ l/ n4 k/ s };

U1 m, p4 i. G9 iint compare(const xnum& A, const xnum& B) 1 ] J- j- V& K, F{ ! c. i7 o0 p/ G$ F/ u# N int I; h* Q* \1 I3 L: ]6 s) z. s' T7 P if (A.Len != B.Len) return A.Len > B.Len ? 1 : -1;6 Q5 ]/ R7 R! Z3 ^ for (I = A.Len - 1; I >= 0 && A[I] == B[I]; I--); l/ K' q7 Z% H m6 a6 l$ ~ if (I < 0) return 0; 1 ~( i7 \7 w5 z: s return A[I] > B[I] ? 1 : -1;' R5 h: S5 g6 r& V }

xnum operator+(const xnum& A, const xnum& B) * n8 j# a3 h1 \{ v9 u" h4 k9 A/ X5 e xnum R;" W+ ~ A: @+ a* J2 H" N" e7 } int I; 2 `7 G! D" O+ ?/ j int Carry = 0;# ^; Q9 s; Y3 {+ }& u# B4 l8 F* Q for (I = 0; I < A.Len || I < B.Len || Carry > 0; I++) ( g3 ^- w3 m! _6 i! M* ^ {( [: l) x% A% B! W } if (I < A.Len) Carry += A[I]; - A% y. @ I. L& X if (I < B.Len) Carry += B[I]; 4 ]* A$ p8 P$ e/ c# N% O3 A R[I] = Carry % Base; 2 v4 L: l5 Q! x; y Carry /= Base;+ t2 \9 k7 | n0 e$ |& W } [ ~; t H. B- Z) s8 ~% J R.Len = I;) t. O. J7 o9 P+ ^. R. ~ return R;1 ~1 I; ? P7 l8 Y5 e }

xnum operator-(const xnum& A, const xnum& B)6 _) Y2 E* r+ K- l8 R; @$ D/ m9 q! q { T! h) w; C. f1 U xnum R; 8 i: O) t4 D7 R+ t. m int Carry = 0; 4 ^$ m$ E3 g) K9 N5 k0 o- ~; S/ q% w R.Len = A.Len; & J! q' I' B6 g0 j int I; * a$ J' {0 ]: F* a for (I = 0; I < R.Len; I++)$ `/ X: m& F3 F {. _# e% Q5 ]9 S; E9 }! F. m# z0 A1 a R[I] = A[I] - Carry; 1 a7 K& v# }6 m( n+ J% O if (I < B.Len) R[I] -= B[I];$ [/ ?5 v% ~% i5 @& N, q& } if (R[I] < 0) Carry = 1, R[I] += Base; : J* F* ?0 N% P& _* h else Carry = 0;: v2 Q7 }1 l' ^. D3 V. ]% } } 7 @5 g1 [1 l! j- k: c; F while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--; _* h0 [3 @, d- ]: K& O X ?6 O return R;% }. v; }& W* m }

xnum operator*(const xnum& A, const int B) 1 K/ ?% N; _# a+ g, J{0 M; l5 w) g, C& C% h int I; $ X2 b9 n7 B; a+ O/ f+ U& X; S if (B == 0) return 0; v( l' E$ L. M1 G2 q1 F xnum R;/ V- @# q' h4 l+ h1 H- t2 Z. o9 w hugeint Carry = 0; * u4 m4 ?; E) S; i for (I = 0; I < A.Len || Carry > 0; I++); ]3 ^7 g4 I. L- ] V6 v+ v { % i! P2 h1 \" [1 z, {' F; S+ L if (I < A.Len) Carry += hugeint(A[I]) * B; ) T; F% X `; R* C p( q; L6 Z, } R[I] = Carry % Base;8 b! U$ M N, T& H8 X Carry /= Base; : t( B1 ?8 q- X Z1 l$ f* H } . g* u( q) G8 y7 j- ^6 N: m n; J R.Len = I; " |8 F( V, i. e) n# Z$ k& D+ P return R;3 d% t8 A/ W! w1 \$ ^! B) T7 y }

xnum operator*(const xnum& A, const xnum& B) 4 _' o5 F. M& c{ , C- [+ `) B: Z7 P/ N2 x int I;! l- F& ]1 R- W5 t, c$ p$ g. x5 Z if (B.Len == 0) return 0; $ Y" \, @7 t/ R4 b xnum R; - N' F6 O2 z+ j" @7 b v for (I = 0; I < A.Len; I++) ; V! {! @. n- C0 P. N; C$ ` { 5 g/ E7 |1 ~% {1 m, ^ hugeint Carry = 0; ( }1 a: @0 t' o# F2 \/ v4 [: X# ?# A for (int J = 0; J < B.Len || Carry > 0; J++) 9 C+ z! b, x" g1 _ O2 q { 6 ?$ n0 L8 X5 U8 ^# R if (J < B.Len) Carry += hugeint(A[I]) * B[J]; 7 y- m0 O! A2 F+ u; v r$ a/ d if (I + J < R.Len) Carry += R[I + J]; ! o+ _7 I6 C2 u7 M0 L2 a0 E if (I + J >= R.Len) R[R.Len++] = Carry % Base;7 x+ i, v7 K1 h2 p# l0 [ m2 w else R[I + J] = Carry % Base; " Q4 L8 {9 Z/ M+ i- k Carry /= Base; n( E/ f: A( d$ R8 E& Z1 V } % K. g8 M7 l* V } 0 U% j2 D d( | return R;* \/ z" h0 B/ c% L- @! D1 Z }

xnum operator/(const xnum& A, const int B) . g1 }) r" q! L1 J{ 0 G, g" _* x0 b/ [/ P5 N xnum R;; J" o" `. l) {6 L int I; 3 A ]: r' U. d/ g" [( q7 g hugeint C = 0; " o4 I- C* r# B/ H6 j U7 C for (I = A.Len - 1; I >= 0; I--) . ^ [3 B& ^; \# G& @5 ^. \1 s {9 |! r! ~7 b c. i8 C, y# d C = C * Base + A[I]; 4 }8 x) R4 g" O" M% _ R[I] = C / B; * {. K/ t$ Z" \: y C %= B; 5 _7 e7 Q$ o( [: t+ c) Q }, r7 Q1 s6 x- `$ u R.Len = A.Len; ! m. J) C3 `, ` while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--; : P+ x; h2 S' R, [) c' c return R;( c( E, o l# _6 i1 r }

xnum operator/(const xnum& A, const xnum& B) l- p7 P' T! x$ D { + e" V% C$ C# m, M! r( m' v5 T7 i int I; % i' W& e0 I0 q; k8 v1 [ xnum R, Carry = 0; + o! x0 ?5 \6 B3 X7 ]7 \* i( y int Left, Right, Mid; ! X) L$ U4 c: S for (I = A.Len - 1; I >= 0; I--) 8 @5 S! S, _1 A, O$ m { ( s: I1 Z+ x8 [; T! K# \ Carry = Carry * Base + A[I]; % A' h% e( o- V5 W [ Left = 0; " K4 Q5 r5 T5 }- d+ J; ^- g Right = Base - 1; , q: w4 x' _# d2 @ while (Left < Right); c8 A' j, \5 W. A o, M/ z {8 L8 z. i2 v; K7 L4 r Mid = (Left + Right + 1) / 2; ( `# z6 J+ o4 U. p1 z if (compare(B * Mid, Carry) <= 0) Left = Mid; . p' T& Q$ k: f* A else Right = Mid - 1;; G( i$ Z. y* J6 [+ m2 E } 3 y8 G, T4 s: {' [8 N1 F R[I] = Left;8 L7 h0 [7 E$ a) c5 g5 m: \* m Carry = Carry - B * Left; : K+ T8 a, }5 c7 ^/ q: O. e } # s1 n( d: I+ @' y2 q& G R.Len = A.Len; 6 g; @6 x8 ]; ?9 H6 y while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--;0 S4 K) O4 n K return R;: A, ~0 c: }; ^ } # q- |7 h) D5 T2 s8 d5 B# ixnum operator%(const xnum& A, const xnum& B) ! _) Q# k6 H( F! q: B+ p{ 5 s: Q# \8 [8 N O" B7 U4 y8 f int I;$ A- D3 E. I" Z xnum R, Carry = 0;. d- c) l1 n% r int Left, Right, Mid; 6 N. F% Y, C/ a2 U6 S7 B for (I = A.Len - 1; I >= 0; I--)9 [9 ?( T2 x% l' z { 7 V( Y0 w8 M9 x9 y! J" M, z& q Carry = Carry * Base + A[I]; 8 b4 W; c) Z+ o! j' ~, T# i Left = 0; # n: ]( p: d# Y L, c Right = Base - 1; ; l" O2 G4 K8 D% L8 V* V& Q8 R while (Left < Right): z- y* P7 ^6 Q { D0 c; I4 x7 W8 `4 ~ Mid = (Left + Right + 1) / 2;) A& c+ x" k7 M6 g if (compare(B * Mid, Carry) <= 0) Left = Mid; $ n9 m. n/ R& O# U! {7 _4 J" H' N else Right = Mid - 1;: y# I$ n6 [' \4 K, x/ ] }9 o$ M$ [- X% a* W- d! j7 \" S R[I] = Left; ( ?! V s: W D Carry = Carry - B * Left;) ^, R0 l8 q; \) S( i. d }: A1 ? q5 C7 S R.Len = A.Len; # R; V- S* _' ~6 Y/ {3 s while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--; # n/ d0 b/ ?" O1 n( V return Carry;2 C) Q& f' _& m2 h* _( w, j }

istream& operator>>(istream& In, xnum& V)5 s5 H. h: H' Q1 m x5 N9 o { 5 a# g @4 H, i& R char Ch;% |0 z" ]$ z4 k7 v0 R3 d for (V = 0; In >> Ch;) : C) V& a" [8 x8 k {6 o, e$ l7 y. Y+ I V = V * 10 + (Ch - '0');+ {6 l& ]7 T) d if (cin.peek() <= ' ') break; G( K/ s. o5 K% y }5 r# @7 I! b3 T0 |' O return In; % W+ U8 P! _5 n, z}

ostream& operator<<(ostream& Out, const xnum& V) % ~3 }; i3 ]) x6 T{ 9 ?2 Z& p8 Y: i$ _0 H8 P int I; 6 G: T5 s6 L U% F9 `( z/ Z Out << (V.Len == 0 ? 0 : V[V.Len - 1]);: b; V2 f* }8 u( D& }) B+ H2 h for (I = V.Len - 2; I >= 0; I--) for (int J = Base / 10; J > 0; J /= 10) Out << V[I] / J % 10; # {2 \6 c0 Z1 J$ p+ P return Out;; \+ W( |) ~+ t$ r- j/ G } : M7 ~3 J0 H/ k+ T5 A# f8 k3 x6 l! s

回复

使用道具 举报

0

主题

2

听众

32

积分

升级  28.42%

该用户从未签到

新人进步奖

回复

使用道具 举报

cshdzxjtu        

2

主题

2

听众

38

积分

升级  34.74%

该用户从未签到

新人进步奖

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-18 09:12 , Processed in 0.469298 second(s), 73 queries .

回顶部