QQ登录

只需要一步,快速开始

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

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

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

1

主题

0

听众

49

积分

升级  46.32%

该用户从未签到

新人进步奖

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

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

. U$ w7 @1 P* ]4 D+ y

现在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>: K' j' f& f! V# }! H #include <memory>. h( {5 B+ O6 d' A( |2 t2 B # include <string># ~# H: ^( E: L3 { using namespace std;

typedef long long hugeint;

const int Base = 1000000000; & Y/ ?$ m. W' r2 ^, d$ rconst int Capacity = 200;

struct xnum 5 @; ^, X' [0 M" {" V, R{ " G5 s" Q4 F1 h Y' b int Len;% N8 u, q+ U' G" S; M int Data[Capacity]; 4 a4 ^& r' Q q6 x2 v xnum() : Len(0) {} 1 o$ c% X4 C& h xnum(const xnum& V) : Len(V.Len) { memcpy(Data, V.Data, Len * sizeof *Data); } - |" T9 b1 c- A3 D( A xnum(int V) : Len(0) { for (; V > 0; V /= Base) Data[Len++] = V % Base; }. j9 F5 a+ p. U; G, i$ N* U xnum& operator=(const xnum& V) { Len = V.Len; memcpy(Data, V.Data, Len * sizeof *Data); return *this; }9 Z6 J& P' V6 _" y# U; N" L int& operator[](int Index) { return Data[Index]; } ; j) s" T. Z0 V7 K/ I# P: W9 A int operator[](int Index) const { return Data[Index]; }( B/ v6 k$ k" L; `% ]- j) L; e };

; C! N0 X& O1 l2 Iint compare(const xnum& A, const xnum& B)5 \+ j! y2 Q2 F; X7 S" } {( m4 ?3 L2 m. t- T8 R9 g int I;$ N0 D2 S$ ~- w; `" } if (A.Len != B.Len) return A.Len > B.Len ? 1 : -1; ) g+ X) R, h# X7 u8 A7 | for (I = A.Len - 1; I >= 0 && A[I] == B[I]; I--);0 D) V# T. l% @: G if (I < 0) return 0;; C6 Z4 M0 K% o: f6 X: X( N return A[I] > B[I] ? 1 : -1;0 B* b6 {, u4 ?# _/ w; I }

xnum operator+(const xnum& A, const xnum& B); G& t* ^4 X9 x8 d { " Z. _9 H, K7 U5 g xnum R; 3 C, U2 v$ J) ], |# r+ q int I; ) N) B- ^4 t& {) H. P& | int Carry = 0;* l% g% M: Q* [' r for (I = 0; I < A.Len || I < B.Len || Carry > 0; I++) . S! P5 y# u& N3 s9 k% [: }6 |/ | { ( q& @/ l J6 f5 d# A3 [/ u* p4 m* s6 H' \ if (I < A.Len) Carry += A[I]; " E' F, ^. v% O5 ~) i* H- E if (I < B.Len) Carry += B[I]; 0 ]3 T6 r% _9 T; x; e R[I] = Carry % Base; / b- T1 g* e; u. C# n& L Carry /= Base;3 J) q% y1 t$ C# C7 s } 9 |* y- Z% Z+ u4 j- ? R.Len = I; ; Z0 o" h, T P! h8 N return R; k% B8 e5 @5 W& c& R }

xnum operator-(const xnum& A, const xnum& B)- h3 U; p; I1 \4 E! g) Q { + C& W2 }# C! a" `0 U xnum R;2 B w" [# t# P" H& t3 B3 H/ m int Carry = 0;0 \; o3 S2 e! J, X, t7 F( k R.Len = A.Len;0 U, v: c* \! O4 B/ h$ t3 @ int I;- P$ W2 c* N5 J7 `* [ for (I = 0; I < R.Len; I++) ( k9 e2 q4 b9 e% u5 ^: s# B$ U { 7 P2 W" o( n% N6 T- J7 N R[I] = A[I] - Carry; p; D& U& {3 O+ z2 p if (I < B.Len) R[I] -= B[I]; 7 T/ e5 c1 E+ }. ?0 x' A if (R[I] < 0) Carry = 1, R[I] += Base; : w! W. h8 J( H+ Q else Carry = 0; 2 c8 D. f/ y3 n- w8 B# m0 Q. F } : P2 u: k* ~9 v$ q while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--; / Y9 o! ?' V$ u, d+ f return R;, j! T- {6 w7 v0 I9 G- d" @ }

xnum operator*(const xnum& A, const int B) 4 ~. d8 l$ v0 c# D! M' k{4 w R4 q. A! s* @ int I; 6 x! q1 `; ^; s5 g1 d5 M# N if (B == 0) return 0;) K7 S0 F; O& g- u xnum R; P2 p3 P3 k2 ]. g hugeint Carry = 0; , X6 S( a+ b. {0 r: A2 u for (I = 0; I < A.Len || Carry > 0; I++)& P( _) ]' Q2 H3 v( d1 T {. S3 r) g& b$ N/ H: V3 P) | if (I < A.Len) Carry += hugeint(A[I]) * B; C: k [) K9 ?/ [5 e2 U3 o R[I] = Carry % Base;5 _& m& M2 z$ s; p, S1 s& a1 H# G Carry /= Base; 1 p- X) ^: _. M+ ^$ ] } & X' R/ u. n d. p" G/ k- B' s R.Len = I; - j2 K/ j T8 B3 ]3 v return R;7 x0 r, I; I5 M' Z0 L" y }

xnum operator*(const xnum& A, const xnum& B) A( o9 r, _$ [+ C# a { 9 p; s! O% M! I1 B. } int I; 9 j! ~: f+ d2 i) B; P3 ] if (B.Len == 0) return 0;/ ]4 [5 A& W& d+ G/ }, J4 h, @ xnum R;: k! u8 p" c$ V5 A- K R for (I = 0; I < A.Len; I++)0 r4 _& w& Z5 y" t) `- \5 I { , F7 s" r' j5 H* M hugeint Carry = 0;( q0 t- n; @' r3 G* w for (int J = 0; J < B.Len || Carry > 0; J++) + i- c, q" \1 Q% [# R8 `: G4 V {% Z( P) c( \7 S% y if (J < B.Len) Carry += hugeint(A[I]) * B[J];8 ]6 S. I8 H1 \) m2 t# W" K& J if (I + J < R.Len) Carry += R[I + J];! n9 v, q% u: d8 j$ ~2 D+ ?, m if (I + J >= R.Len) R[R.Len++] = Carry % Base;$ a- O+ a: \1 w" V0 B/ l0 n _ else R[I + J] = Carry % Base; / p: {, z: ^1 J8 P. p9 ?4 Q Carry /= Base; ! ~6 Y4 j" M( i( [" b } . [: W q' w7 i7 _ } # u; }1 y! m" B+ }( W8 U7 i5 X return R;1 y9 [) d) u* U9 P+ j. a! H }

xnum operator/(const xnum& A, const int B)4 m4 I( f1 y4 H5 m1 L { & t7 E0 f; U1 s9 e8 E; c6 e xnum R;1 y7 A: N6 Q# A1 S! |; E$ _" h int I; ' e! I' Q, e S3 X7 ^ hugeint C = 0; $ h! }8 `: i4 K- i% _! E" E8 y for (I = A.Len - 1; I >= 0; I--) 1 l" p" o% N% u$ C) y+ c# T; I {& o8 Y3 o) m9 C# @! ~1 l7 z. U C = C * Base + A[I]; $ i: o8 N- V: b$ G J) z, K3 P R[I] = C / B; 1 k5 j3 p2 r: \, c C %= B; W* p( e H4 k* o9 @/ p6 A; G }& Y: O3 i9 @0 a R.Len = A.Len; 5 L. z6 I0 s" [( {: E+ l: m while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--; 8 j1 [/ k; t- K6 o8 M! C return R;" _' ]! ?/ O! T4 J& [! N; ^ }

xnum operator/(const xnum& A, const xnum& B)) M; |/ |0 X& _1 P/ S {0 T ]$ m% |* T8 [ }' W9 G int I; 6 L: a4 _( Z' l8 @8 ~: h' u S xnum R, Carry = 0; # R0 H$ H! x9 H- S p2 e$ @ int Left, Right, Mid;; m- s! `" |* q" Q, E5 U# i for (I = A.Len - 1; I >= 0; I--), V$ h. ^) Q l e# w' b/ G4 @. e. `) A {- `) N2 u" L1 D Carry = Carry * Base + A[I]; + J' t' n7 r' c7 \: w6 P. @ Left = 0;0 `6 t. R5 A) r' q! t Right = Base - 1;. |: L- j6 `5 L6 | while (Left < Right) . j6 B! D( |3 e# i& }4 F { ( L$ q7 x: j+ \2 t% u! d Mid = (Left + Right + 1) / 2; 1 ?' b' J( S6 H2 ]9 u if (compare(B * Mid, Carry) <= 0) Left = Mid;- ~2 y2 X3 a0 F3 K$ o Q else Right = Mid - 1; 0 f4 ], R/ i( A } 2 e9 b- K, {+ D* G; K R[I] = Left; 9 a0 K3 X1 X( B: a0 ~ Carry = Carry - B * Left; 4 c" s' ]% n$ `: }' r% Q: N) m }! _$ r- v* Q) m. q R.Len = A.Len; : o/ B% F; P$ b while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--; Y% Q! l2 K+ c' m. w' P return R;; w7 C! m. \3 K3 P } 0 j- @( ` l1 E5 D. Fxnum operator%(const xnum& A, const xnum& B)' O' F) U% J$ K3 ?! x! ^ {& k) j! B( Y; \6 A int I; 5 i& T# ]7 Q+ u xnum R, Carry = 0; 2 l% n# A n$ Q7 P9 e int Left, Right, Mid; ; H/ v- s3 Y' d k for (I = A.Len - 1; I >= 0; I--) 3 B" i$ ?2 @" p& R, y& J {5 f& W5 c \0 } Carry = Carry * Base + A[I]; 5 d/ t: ^8 F! O9 c& d Left = 0; " i; K' Q6 |* t Right = Base - 1;- J2 C% W( q; P6 V$ e @ while (Left < Right) & l/ H" g3 m' Z3 {) h) f { 2 Y! D7 r. h8 F Y& Y5 w Mid = (Left + Right + 1) / 2;7 h; \8 S3 h" J6 l P5 {1 Y if (compare(B * Mid, Carry) <= 0) Left = Mid; 4 F, a+ ~4 r6 o# D( x( U# K: I* L else Right = Mid - 1; 1 e7 S1 X% w- e/ w8 u } l- B* W, Y& j( r0 u2 u R[I] = Left; " a# C5 M. d8 t) v3 ?; v Carry = Carry - B * Left;# K, d8 e7 m A6 g7 T }5 @ W+ W/ m6 I1 r8 A5 @6 f R.Len = A.Len;. K) v+ N' V' p- H5 ]" G while (R.Len > 0 && R[R.Len - 1] == 0) R.Len--; % q3 E/ b0 P/ ^0 V3 x1 q; Y' X# C return Carry;" [' U1 |, ^7 k4 S& l }

istream& operator>>(istream& In, xnum& V) % ^8 Z, u+ t- k( s7 |, a{ ) [' ]0 r0 |3 ~% @- k char Ch; 4 f7 p% b* V3 l for (V = 0; In >> Ch;)1 H! l, t) o% y1 ~; I {0 u" w8 c0 o, b6 N V = V * 10 + (Ch - '0'); " _0 r% p X) u: f) f if (cin.peek() <= ' ') break; # x5 X8 l4 y3 ^, W# ]4 v }6 u4 Y. b k6 A- q- B# i; D9 z return In; 4 ~$ Z5 L, s. n* B0 I& l; t}

ostream& operator<<(ostream& Out, const xnum& V) # Y0 N3 \- D# [, ]! G! s{1 i4 Z& U( r4 }& ]0 D5 U: B2 u+ h4 J" T int I;; D1 Q2 D9 }* B9 y1 \- _( n Out << (V.Len == 0 ? 0 : V[V.Len - 1]); + ^+ A0 c/ A5 V for (I = V.Len - 2; I >= 0; I--) for (int J = Base / 10; J > 0; J /= 10) Out << V[I] / J % 10; . |2 k) L- P* \9 b- D) D) L return Out; 4 i8 k( c8 y/ i, P# W}3 U4 w' {% T, ]1 T' n F& T4 o8 c

回复

使用道具 举报

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-5-28 14:19 , Processed in 0.470079 second(s), 72 queries .

回顶部