高精度加法

1. 思路

其实就是模拟,加法是最简单的,从个位开始加,价位加到前一位,然后再取10的余数。

    for (int i = 1; i <=len ; ++i) {
        // 计算和
        c[i] += a[i]+b[i];
        // 进位
        c[i+1] = c[i]/10;
        // 取10的余数
        c[i]%=10;
    }

2. 实现

    int len = max(A.length(),B.length());
    // 倒着存,个位到十位,百位。。
    for (int i = A.length()-1,j=1; i >=0 ; i--,j++) {
        a[j] = A[i] - '0';
    }
    for (int i = B.length()-1,j=1; i >= 0; i--,j++) {
        b[j] = B[i]-'0';
    }
    for (int i = 1; i <=len ; ++i) {
        c[i] += a[i]+b[i];
        c[i+1] = c[i]/10;
        c[i]%=10;
    }
    if (c[len+1])len++;
    // 逆序输出
    for (int i = len; i >=1 ; i--) {
        cout<<c[i];
    }

luogu上面是从1开始,就是数组0号位不用,我比较习惯从0开始用。

所以稍微适配一下从0开始的写法:

    string A,B;
    cin>>A>>B;
    int len = max(A.length(),B.length());
    // 倒着存,个位到十位,百位。。
    for (int i = A.length()-1,j=0; i >=0 ; i--,j++) {
        a[j] = A[i] - '0';
    }
    for (int i = B.length()-1,j=0; i >= 0; i--,j++) {
        b[j] = B[i]-'0';
    }
    for (int i = 0; i <len ; ++i) {
        c[i] += a[i]+b[i];
        c[i+1] = c[i]/10;
        c[i]%=10;
    }
    if (c[len])len++;
    // 逆序输出
    for (int i = len-1; i >=0 ; i--) {
        cout<<c[i];
    }

3. 相关题目

洛谷p1601

hdu1002

lc415

4. 后记

有时候不要懒,没有那么复杂,当然这个是裸的写法,最好是整合到struct 封装一下,再重载运算符来简化一下操作,之后会总结。

原文地址:https://www.cnblogs.com/gqdw/p/14401705.html