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 bsearch Article g Mortgages search Findmortgagehomemortgages o Article tgsearchge Age sa Mortgage c Mortgage s Find searchg Home Mortgage o Finace t Finace asearche Mortgage Mortgages s Mortgages a Home cs id Findmortgagehomemortgages osearcht Home ae Home o Mortgages emsearchr Article gsearchg Findmortgagehomemortgages s search searchz Finace Article bpsearch searchn Finace s;search& Home bs Article ;&searchbp Findmortgagehomemortgages searchnsp 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  
$ /Rr|<  
//按索引获取单元值 (c3%rM m]  
unsigned flex_unit::get( unsigned i ) const !u0|{}m.r5  
return a[i]; ;~nz%L J  
} 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`n qn  
{} 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; y wk;  
for (i=0; i<min; i+=1) 7& k lX  
{} N>ct`a)BD/  
  while ( c && j<limit ) bHS2;K~  
  {}u'!LKul
 
    j += 1; ~g|e?$j  
  } d'[aOH4}  
} XZ|"7as  
#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>SeOnf  
//获取大数位(bit)数 +\%z y=  
unsigned vlong_value::bits() const {} 7yp*I[1Qf>  
E@Fen CF  
//比较两个大数值大小 ]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) x X/s1(P  
{} "WbVCT'i  
  set(i,u); 4s~HfxY T  
} .blft,'  
} /ggkb8<3  
z{}hY {}j6 .r  
{}  lk_s!<ni  
} my ;  
\5'O.*pr   
//大数减法 Iz}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) {} *zq.C  
} f`9JE8  
    P/ci/y_1  
vlong_value::vlong_value() pp rejUR  
{} YZ+>\ x  
&y7 0  
//大数乘法 1?(cmXj  
void vlong_value::mul( vlong_value& x, vlong_value& y ) 4qt+uNe!  
{} cGNvEM(4AV  
S ZlC4=6c