今天继续高精度的四则运算,原理昨天已经了解过了。
高精度减法:
bign jian(bign a, bign b)
{
bign c;
for(int i = 0; i < a.lenth || i < b.lenth; i++){
if(a.d[i] < b.d[i]){ //如果出现不够减的情况
a.d[i + 1]--; //向高的一位借位
a.d[i] += 10; //当前位加10
}
c.d[c.lenth++] = a.d[i] - b.d[i]; //减法结果为当前位的结果
}
while(c.lenth - 1 >= 1 && c.d[c.lenth - 1] == 0){
c.lenth--; //去除高位的0
}
return c;
}
高精度乘法:
bign multiply(bign a, bign b)
{
bign c;
int carry = 0;
for(int i = 0; i < a.lenth; i++){
int temp = a.d[i] * b + carry;
c.d[c.lenth++] = temp % 10;
carry = temp / 10; //高位部分作为新的进位
}
while(carry != 0){ //乘法的进位可能不止一位
c.d[c.lenth++] = carry % 10;
carry /= 10;
}
return c;
}
高精度除法:
bign divide(bign a, int b, int& r) //r为余数
{
bign c;
c.lenth = a.lenth; //被除数的每一位与商的每一位一一对应
for(int i = a.lenth - 1; i >= 0; i--){
r = r * 10 + a.d[i]; //与上一位遗留的余数组合
if(r < b){
c.d[i] = 0; //不够除,该位为0
}
else{
c.d[i] = r / b; //够除,为商
r = r % b; //获得新余数
}
}
while(c.lenth - 1 >= 1 && c.d[c.lenth - 1] == 0){
c.lenth--; //去除高位的0
}
return c;
}