Mortgages { Finace Finace _search
Find searchr Szh ilsearch searchn
Age searchzsearch search
l Home s Mortgages Article l Szh x Home u Home i Age & Mortgage b
search Article g Mortgages search Findmortgagehomemortgages o Article tgsearchge
Age s
a Mortgage c Mortgage s Find searchg
Home Mortgage o Finace t Finace asearche Mortgage Mortgages s Mortgages a Home cs
i
d Findmortgagehomemortgages osearcht Home a
e Home o Mortgages emsearchr Article gsearchg Findmortgagehomemortgages s search searchz Finace Article
b
psearch searchn Finace s
;search& Home bs Article ;&searchb
p Findmortgagehomemortgages searchn
sp
n Mortgage ssearch; Findmortgagehomemortgages &searchb Find p Find &
bs Finace ; search -=5]B ;
{}C1
unsigned z; //分配单元数 'PiQ|Nnb|
public: )~@iM.}S2
unsigned n; //已使用的单元数(只读属性) MoAZ!cF8
flex_unit(); c*R?eLt/
~flex_unit(); <;) qyP
void clear(); //已使用单元数n清0 fbv%&z
unsigned get( unsigned i ) const; //获取第i个单元值 luLt~A3H$
void set( unsigned i, unsigned x ); //设置第i个单元值 wP-BaB$_
void reserve( unsigned x ); //扩展存储区 3hUU$|^4gm
|Iq#Q3w
//有时间要求的乘法 W[ZW=c
void fast_mul( flex_unit &x, flex_unit &y, unsigned n ); ?VM4_dugf
}; [OTZ"XQLI
$/R r|<
//按索引获取单元值 (c3%rM m]
unsigned flex_unit::get( unsigned i ) const !u0|{}m.r5
return a[i]; ;~nz%LJ
} H<YhO&D*u
?U^h:n
//清空 @ckOLtxE>
void flex_unit::clear() A]x'!qa@=
{}+Q
} *d%U]Hby,
v8PH(d2{} NEY
b-#v
3aK/5)4|B
//析构函数 _jhdqON6E
flex_unit::~flex_unit() A&dNCB
{} [;]@PKW?w
delete [] a; $!msav
} 9gz"
r
rX8EXraO
//改变大数尺寸 wu2AhMGmw
void flex_unit::reserve( unsigned x ) te+5@k#t
{} l7]$Wc[
} `P `nqn
{} Sa&~\!0t
else if ( x ) [@}{}Sv
reserve(i+1); ? OBe!NDf
for (unsigned j=n;j<i;j+=1) a[j] = 0; 6e@
O88=
a[i] = x; SnbH`\U"
n = i+1; iSx
xy1R
} 7"f$;CN?~
} *@Z/L26s;=
0EM`,?i .Q
#define BPU ( 8*sizeof(unsigned) ) //unsigned int类型bit数 n=RAE^[M
#define lo(x) ( (x) & ((1<<(BPU/2))-1) ) //unsigned int低半部分 SVp]}
!jI
#define hi(x) ( (x) >> (BPU/2) ) //unsigned int高半部分 I~S`'()J
#define lh(x) ( (x) << (BPU/2) ) //使低半部分左移至高半部分 `n:IXD5'
~?vm97l
//快速乘法 {}9y>+>
reserve(limit); ^ h^2='p
for (i=0; i<limit; i+=1) o lNL|WJ`w
a[i] = 0; 0
+8ThZ?n
unsigned min = x.n; kTex>1W;
if (min>limit) 2 <&-
min = limit; ywk;
for (i=0; i<min; i+=1) 7&klX
{} N>ct`a)BD/
while ( c && j<limit ) bHS2;K~
{}u'!LKul
j += 1; ~g|e?$j
} d'[aOH4}
} XZ|"7a s
#Z$
6>
Xt
//去除不必要的bit &@+K%qW[e
keep %= BPU; JEHV\=
if (keep) y\0^c5}
a[limit-1] &= (1<<keep)-1; Ac7`nvI=
f6|3|
+
//计算使用单元数 m]"YR_
while (limit && a[limit-1]==0) /0o 2
limit-=1; /$eEj
n = limit; W^=89I4]
}; (ZEVbAY?i
c(Ha"tBJ
/*---------------------------------以上为flex_unit类定义与实现----------------------------*/ oC7#6W:@w
X! 2|_
KFfwZkj{}'LS
SD.ze(P
class vlong_value : public flex_unit //继承自flex_unit,负责vlong类内存管理 ]@8=e'V
{}; 'oEmbk8Hg
Cn<kl^!Q-
(j/O=$mJ
// 将大数转换为无符号整数 lt4UNJ3w
vlong_value::operator unsigned() zKutx6=aj
{} L!G3u/
Ygl!fC
4b
// 测试大数是否为0 'YeJGzsJp
int vlong_value::is_zero() const 6{} 21[F%,{}pR')YL[
} 'zb7:[[7%
c>Se Onf
//获取大数位(bit)数 +\%z
y=
unsigned vlong_value::bits() const {} 7yp*I[1Qf>
E@FenCF
//比较两个大数值大小 ]YP?bP,:
int vlong_value::cf( vlong_value& x ) const UVK"%kW#(
{}0D^jDeE
if ( n < x.n ) return -1; >$DqG$D
unsigned i = n; 3o>t~Sfi
while (i) ja/[PHq"
{} ` qTY
return 0; vXbT E$
} w|C~{} &Fjilx'k
} fhKiG%i'l
~qxXou,J
//按位右移 u=o"^
void vlong_value::shr() ;bZ*6-\!-
{}
5!jNL~M
} X|E+K
V<ApHb
//左移x位 'z}M[h
K]
void vlong_value::shr( unsigned x ) |( 9#v
t#
{}BdVD t
x %= BPU; %M#?cmt
for (unsigned i=0;i<n;i+=1) xX/s1(P
{} "WbVCT'i
set(i,u); 4s~HfxY
T
} .blft,'
} /ggkb8<3
z {}hY{}j6.r
{}
lk_s!<ni
} my ;
\5'O.*pr
//大数减法 I z}2
^
void vlong_value::subtract( vlong_value & x ) tw'hh@7-Y
{}
unsigned N = n; .!JMPf"QEI
for (unsigned i=0;i<N;i+=1) b JfD\
{} NW{} 4~O6$;!|~
} Dd| "iA
96c"I;\GXX
//使用无符号整数x初始化大数 br0u@G
void vlong_value::init( unsigned x ) $ZQ"({} (lb6]MtTHY
:.#z
//将参数x(大数类型)值赋给本实例 bA}Z0a
void vlong_value::copy( vlong_value& x ) k, f)2<
{}ng_c
unsigned i=x.n; m}98bw
while (i) {} *z q .C
} f`9JE8
P/ci/y_1
vlong_value::vlong_value() pp
rejUR
{} YZ+>\ x
&y70
//大数乘法 1?(cmXj
void vlong_value::mul( vlong_value& x, vlong_value& y ) 4qt+uNe!
{} cGNvEM(4AV
S ZlC4=6c