洛谷刷题记——P1601 A+B Problem(高精)

最近要开始刷一些高精相关的题了,加油↖(^ω^)↗

写在前面

我这里有一份高精相关题目(普及难度左右),接下来我都会刷里面的题,地址是:https://www.luogu.com.cn/training/9866

题目描述

https://www.luogu.com.cn/problem/P1601

解题思路

整体上来说就是模拟加法竖式,将数字转成字符串来处理,逐个位加、进位。

细节处理上,注意如果两个数位数不一样的话,要在位数少的数前补零。

代码展示

细节注释都在代码块内:

#include <iostream> // std::cin, std::cout, std::endl
#include <string> // std::string

using namespace std;

string add(string, string); // 高精加法函数

int main(void)
{
    string str1, str2;

    cin >> str1 >> str2;
    cout << add(str1, str2) << endl;

    return 0;
}

string add(string str1, string str2)
{
    int cf = 0, len1 = str1.length(), len2 = str2.length(), tmp = 0;
    string res;

    if(len1 < len2) // a比b短
    {
        for (int i = 0; i < len2 - len1; i++) // 在a前面补零
        {
           str1 = '0' + str1;
        }
    }
    else // 反之亦然
    {
        for (int i = 0; i < len1 - len2; i++)
        {
           str2 = '0' + str2;
        }
    }

    len1 = str1.length(); // 现在两个数一样长了

    for (int i = len1 - 1; i > -1; i--) // 倒着加,将进位数当做当前位和
    {
        tmp = str1[i] - '0' + str2[i] - '0' + cf; // 加法,两个数的对应位相加,再加上一位的和
        cf = tmp / 10; // 留下这一位的和
        tmp %= 10; // 将这一位的进位数当做当前位的和
        res = static_cast<char>(tmp + '0') + res; // 添加在结果前
    }

    if (cf != 0)
    {
        res = static_cast<char>(cf + '0') + res;
    }

    return res;
}

写在最后

这题也算圆满完成了↖(^ω^)↗

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

返回顶部