基础算法_高精度算法

存储方式:

  • 使用字符串、数组存储
  • 从低位到高位依次存放, 即string[0] 存放个位

创建: 将字符串转换成数组

    string x, y;
    vector<int> a, b;
    cin >> x >> y;
    for(int i = x.length() - 1; i >= 0; i--) a.push_back(x[i] - '0');
    for(int i = y.length() - 1; i >= 0; i--) b.push_back(y[i] - '0');

输出函数

void display(string s) {
    for(int i = s.length() - 1; i >= 0; i--)
        printf("%c", s[i]);
    puts("");
}

高精度加法: 两个大数相加

思路:

  • 模拟列竖式加法,使用中间变量t,将t的个位上的数存入答案数组

代码模板

vector<int> add(vector<int> &a, vector<int> &b) {
    vector<int> ans;
    for(int i = 0, t = 0; i < a.size() || i < b.size(); i++) {
        if(i < a.size()) t += a[i];
        if(i < b.size()) t += b[i];
        ans.push_back(t % 10);
        t /= 10;
    }
    if(t) ans.push_back(1);
    return ans;
}

高精度减法: 两个大数相减

思路:

  • 判断结果的正负,如果前者大于后者结果为正,否则计算后者减前者,再加上一个负号

代码模板

bool cmp(vector<int> &a, vector<int> &b) {
    if(a.size() != b.size()) return a.size() > b.size();

    for(int i = a.size() - 1; i >= 0 ; i-- ) {
        if(a[i] != b[i]) return a[i] > b[i];
    }
    return true;
}

vector<int> sub(vector<int> &a, vector<int> &b) {
    vector<int> ans;
    // 通过比较函数已经确定size(a) > size(b)
    for(int i = 0,t = 0; i < a.size(); i++) {
        t = a[i] - t; // 去掉前者的借位
        if(i < b.size()) t -= b[i];
        ans.push_back((t + 10) % 10);
        if(t < 0) t = 1; // 表示借位
        else t = 0;
    }

    while(ans.size() > 1 && ans.back() == 0) ans.pop_back();

    return ans;
}

高精度乘法 :一个很大的数乘以一个很小的数

思路:

  • 借用一个中间变量t表示进位,t不为零或者未访问完a数组,循环就一直进行

代码模板

vector<int> mul(vector<int> &a, int b) {
    vector<int> ans;
    int t = 0;
    for(int i = 0; i < a.size() || t; i++) {
        if(i < a.size()) t += a[i] * b;
        ans.push_back(t % 10);
        t /= 10;
    }
    return ans;
}

高精度除法:一个很大的数除以一个很小的数,返回商和余数

思路

  • 模拟列式手算除法, 从高位开始算起,每次将余数乘10,再加上下一位,将r整除b的结果存入答案数组。
  • 反转答案数组
  • 去掉前导零

代码模板

vector<int> div(vector<int> &a, int b, int &r) {
	vector<int> ans;
	r = 0;
	// 模拟手算除法, 从高位算起
	for(int i = a.size() - 1; i >= 0; i--) {
		r = r * 10 + a[i];
		ans.push_back(r / b);
		r %= b;
	}
	// 按照存储方式,从低位开始存储
	reverse(ans.begin(), ans.end());
	// 去掉前导零
	while(ans.size() > 1 && ans.back() == 0) ans.pop_back();
	return ans;
}
原文地址:https://www.cnblogs.com/Hot-machine/p/13186485.html