QQ登录

只需要一步,快速开始

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

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

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

1

主题

0

听众

49

积分

升级  46.32%

该用户从未签到

新人进步奖

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

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

# }5 X% i; f, Q r+ i1 G8 ^

现在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>* 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

回复

使用道具 举报

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-7-27 06:23 , Processed in 0.312640 second(s), 73 queries .

回顶部