大整数:高精度整数,其含义就是用基本数据类型无法存储其精度的整数
大整数的存储
struct bign{
int d[1005]; //整数的低位存储在数组的低位
int len;
bign(){
memset(d, 0, sizeof(d));
len = 0;
}
};
赋值、比大小
// 赋值
bign change(char s[]){
bign a;
a.len = strlen(s);
for(int i = 0; i < a.len; i++){
a.d[i] = s[a.len - i - 1] - '0';
}
return a;
}
// 比大小
int compare(bign a, bign b){
if(a.len > b.len) return 1;
else if(a.len < b.len) return -1;
else
for(int i = a.len-1; i >= 0; i-- ){
if(a.d[i] > b.d[i]) return 1;
else if(a.d[i] < b.d[i]) return -1;
}
return 0;
}
大整数的四则运算
高精度加法
// 加法
bign add(bign a, bign b){
int r = 0, l = max(a.len, b.len); //r进位
bign c;
for(int i = 0; i < l; i++){
int t = a.d[i] + b.d[i] + r;
c.d[c.len++] = t%10;
r = t / 10;
}
if(r) c.d[c.len++] = r; // 还有进位,赋给最高位
return c;
}
高精度减法
// 减法
bign sub(bign a, bign b){
// assert: a >= b
bign c;
int r = 0, l = max(a.len, b.len); //r进位
for(int i = 0; i < l; i++){
if(a.d[i] < b.d[i]){
a.d[i+1]--;
a.d[i] += 10;
}
c.d[c.len++] = a.d[i] - b.d[i];
}
// 移除高位前面的0
while(c.len > 1 && c.d[c.len-1] == 0) c.len--;
return c;
}
注:如果被减数小于减数,需要交换两个变量,然后输出负号,再使用sub函数
高精度与低精度的乘法
// 乘法
bign multi(bign a, int b){
int r = 0; //进位
bign c;
for(int i = 0; i < a.len; i++){
int t = a.d[i] * b + r;
c.d[c.len++] = t%10;
r = t/10;
}
while(r){ // 和加法不一样,乘法的进位可能不止一位
c.d[c.len++] = r%10;
r /= 10;
}
return c;
}
高精度与低精度的除法
// 除法
bign divide(bign a, int b, int &r){
r = 0; //余数
for(int i = a.len-1; i >= 0; i--){
int t = r*10 + a.d[i]; // 临时的被除数
r = t % b;
a.d[i] = t/b;
}
// 移除高位前面的0
while(a.len > 1 && a.d[a.len-1] == 0)
a.len--;
return a;
}