高精度算法——加减乘除

点击查看代码
//高精度算法
//1.先用字符串读入这个数, 然后用数组逆序存储该数的每一位
//(因为数字的加减乘除是从最低位-个位开始计算,逆序存储到数组便可以从下标为0开始计算)
//2.利用数组,模拟加减乘除运算的过程
//⾼精度算法本质上还是模拟算法,⽤代码模拟⼩学列竖式计算加减乘除的过程。

#include <iostream>
using namespace std;

const int N = 1e6 + 10;
int a[N], b, c[N];//b[N]
int la, lb, lc;

// ⾼精度加法的模版 - c = a + b;
void add(int c[], int a[], int b[]){
    for(int i = 0; i < lc; i++){
        c[i] += a[i] + b[i];// 对应位相加,再加上进位
        c[i + 1] += c[i] / 10;// 处理进位
        c[i] %= 10;// 处理余数
    }
    if(c[lc]) lc++;// 如果最高位相加后还有进位(比如999+1=1000),结果长度+1
}

//比大小
bool cmp(string &x, string &y){
    if(x.size() != y.size()) return x.size() < y.size();
    return x < y;
}
// ⾼精度减法的模板 - c = a - b
void sub(int c[], int a[], int b[]){
    for(int i = 0; i < lc; i++){
        c[i] += a[i] - b[i];// 对应位相减(c[i]初始为0)
        if(c[i] < 0){       // 不够减,需要借位
            c[i + 1] -= 1;  // 向高位借1(高位减1)
            c[i] += 10;     // 本位加10(比如 3-5 不够减,借位后变成 13-5=8)
        }
    }
    // 去掉结果前面的无效0(比如 1000-999=1,结果数组里是[1,0,0,0],需要把末尾的0去掉)
    while(lc > 1 && c[lc - 1] == 0) lc--;
}


// ⾼精度乘法的模版 - c = a * b
void mul(int c[], int a[], int b[]){
    // ⽆进位相乘,然后相加
    for(int i = 0; i < la; i++){
        for(int j = 0; j < lb; j++){
            c[i + j] += a[i] * b[j];
        }
    }
    // 处理进位
    for(int i = 0; i < lc; i++){
        c[i + 1] += c[i] / 10;
        c[i] %= 10;
    }
    // 处理前导零
    while(lc > 1 && c[lc - 1] == 0) lc--;
}

// ⾼精度除法的模板 - c = a / b (⾼精度 / 低精度)
void div(int c[],int a[],int b){
    long long t = 0;// 标记每次除完之后的余数
    for(int i = la - 1; i >= 0; i--){
        t =  t * 10 + a[i];// 拼接当前位(余数*10 + 当前位数字)
        c[i] = t / b;// 计算当前位的商
        t %= b; // 更新余数
    }
    while(lc > 1 && c[lc - 1] == 0) lc--;
}

int main(){
    string x, y;
    cin >> x >> b; //y;// 用字符串读入超大数字(避免整型溢出)

    // //减法时比大小
    // if(cmp(x, y)){
    //     swap(x, y);
    //     cout << '-';
    // }

    la = x.size(); 
    //lb = y.size(); 
    //lc = max(la, lb); 加减
    //lc = la + lb; 乘
    lc = la;//除
     // 把字符串逆序存入数组,字符转数字
    for(int i = 0; i < la; i++) a[i] = x[la - 1 - i] - '0';
    //for(int i = 0; i < lb; i++) b[i] = y[lb - 1 - i] - '0';

    //add(c, a, b); //高精度加法运算
    //sub(c, a, b); //高精度减法运算
    //mul(c, a, b); //高精度乘法运算
    div(c, a, b);
    for(int i = lc - 1; i >= 0; i--) cout << c[i];
    return 0;
}

posted @ 2026-02-24 14:55  无酒无剑  阅读(19)  评论(0)    收藏  举报