?? 大數相減 .txt
字號:
//大數相減
//調用形式:N.Sub(A),返回值:N-A
//若兩大數符號相同,其值相減,否則改變參數符號再調用大數相加函數
/******************************************************************/
例如:
A B C
- D E
--------------
= F G H
其中,若C>=E,則H=C-E,carry(借位標志)=0
若C<E,則H=C-E+0x100000000,carry=1
若B-carry>=D,則G=B-carry-D,carry=0
若B-carry<D,則G=B-carry-D+0x10000000,carry=1
若carry=0,則F=A
若carry=1,A>1,則F=A-1
若carry=1,A=1,則F=0
/*****************************************************************/
CBigInt CBigInt::Sub(CBigInt& A)
{
CBigInt X;
if(m_nSign==A.m_nSign)
{
X.Mov(*this);
int cmp=X.Cmp(A);
if(cmp==0){X.Mov(0);return X;}
int len,carry=0;
unsigned __int64 num;
unsigned long *s,*d;
if(cmp>0)
{
s=X.m_ulvalue;
d=A.m_ulvalue;
len=X.m_nLength;
}
if(cmp<0)
{
s=A.m_ulvalue;
d=X.m_ulvalue;
len=A.m_nLength;
X.m_nSign=1-X.m_nSign;
}
for(int i=0;i<len;i++)
{
if((s[i]-carry)>=d[i])
{
X.m_ulvalue[i]=s[i]-carry-d[i];
carry=0;
}
else
{
num=0x100000000+s[i];
X.m_ulvalue[i]=(unsigned long)(num-carry-d[i]);
carry=1;
}
}
while(X.m_ulvalue[len-1]==0)len--;
X.m_nLength=len;
return X;
}
else{X.Mov(A);X.m_nSign=1-X.m_nSign;return Add(X);}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -