//求模運算(呼叫除法)
int bigint::mod(_int64 x)
//比較兩個大數的大小(只用於比較兩個同號的大數)
bool bigint::comp(bigint bi)
}else}}
//加法
bigint bigint::add(bigint addend)
else
return sum;
}//符號相同
sum.m_bsign = this->m_bsign ;
sum.m_nlength = (this->m_nlength > addend.m_nlength) ? this->m_nlength : addend.m_nlength;
_int64km= 0;
boolcarry = 0;//進製標識
for(int i=0; im_nvalue[i] + addend.m_nvalue[i] + carry;
if(km > upperbound - 1)//有進製
else
}if(carry)//如果仍有進製,和的長度加一,並置一
//大數與32位無符號整型相加
void bigint::add(unsigned int addend)
else
//仍有進製,繼續進行進製加
for(int i=1; i < this->m_nlength && carry; i++)
else
}if(carry)
else
return diff;
}if(this->comp(subtra))//被減數大於減數
else
carry = 1;
diff.m_nvalue[i] = km;}}
else//同為負號,將被減數很減數都設定為正數,呼叫減法
diff.m_bsign = p;
}else
else
diff.m_bsign = n;
}return diff;
}//大數乘法
bigint bigint::mul(bigint multiplier)
//積可達到的最長的位數
product.m_nlength = this->m_nlength + multiplier.m_nlength;
if(product.m_nvalue[product.m_nlength-1] == 0)
product.m_nlength --;
return product;
}//大數與64位無符號整型相乘(實際達不到64位)
bigint bigint::mul(_int64 multiplier)
if(carry)
else
return product;
}//除法
bigint bigint::div(unsigned int x,unsigned int *m )
if( (result.m_nlength != 1) && (result.m_nvalue[result.m_nlength-1] == 0) )
result.m_nlength --;
if(this->m_bsign == n)
km = 10 - km;
if(m != null)
*m = km;
return result;
}//冪的計算
bigint bigint::power(bigint index)
str[k] = '/0';
k--;
//下面是根據乙個通用的求冪的快速演算法
if(str[k--] == '1')
product.set(*this);
else
product.set(1);
for(int i= k; i>=0; i--)
product.m_bsign = sign;
delete str;
return product;
}
1024位大數運算 一
近來剛完成了1024位大數運算,拿出來跟大家分享一下。有什麼不對的地方希望大家指出來,感激不盡。definemaxlength 1024 最大位數1024 8 definep0 為正數 definen1 為負數 defineupperbound100000000 進製 class bigint 建構...
大數運算 1 大數儲存
int 16位 32768 32767 注 現在大多數的編譯器的int型是32位的 也就是說跟long型的大小一樣 long long或 int64 64位 9223372036854775808 9223372036854775807 float 32位 精確到小數點後6 7位 double 64...
大數運算 4 大數乘法
首先說一下乘法計算的演算法 同樣是模擬人工計算時的方法。從低位向高位乘,在豎式計算中,我們是將乘數第一位與被乘數的每一位相乘,記錄結果之後,用第二位相乘,記錄結果並且左移一位,以此類推,直到計算完最後一位,再將各項結果相加,得出最後結果。計算的過程基本上和小學生列豎式做乘法相同。為程式設計方便,並不...