算法题每日一练---第81天:高精度加法

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情

一、问题描述

给定两个正整数(不含前导 0),计算它们的和。

其中, 1 整数长度 100000 1≤整数长度≤100000

题目链接:高精度加法.

二、题目要求

样例 1

输入: 12    23
输出: 35
复制代码

样例 2

输入: 123  98
输出: 221
复制代码

考察

1.高精度
2.建议用时15~30min
复制代码

三、问题分析

这一题的数字明显超出所有整形的范围了,我们可以借助string字符串存储,其中字符串的存储范围为:1~65400个字符。通过string输入之后,我们要对数字计算,所以char->int型,通过 -'0' 达到要求。

我们用数组存储每一位的数字,正式开始之前,我们思考一个问题,是正着存储,还是反着存储?

比如 75842这个数字,用下面哪一种存储方法:

下标:0 1 2 3 4
数字:7 5 8 4 2

下标:4 3 2 1 0
数字:7 5 8 4 2
复制代码

肯定使用第二种啊!第一种你看看,最高位还能向前进位吗,再向前冲就是-1了。

对于加法法则,运用小学学过的对应位相加、满10进1就行了。

四、编码实现

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
vector<int> add(vector<int> &a, vector<int> &b)  
{
    int i,k=0;//初始进位为0
    vector<int>c;
    for(i=0;i<a.size()||i<b.size();i++)//在范围内
    {
        if(i<a.size()) k+=a[i];
        if(i<b.size()) k+=b[i];
        c.push_back(k%10);//%10添加
        k=k/10;//进位
    }
    if(k)//确保遗留的进位添加进去
       c.push_back(k); 
    return c;
}
int main()
{
    string s1,s2;//字符串存储
    int i;
    cin>>s1>>s2;
    vector<int>a,b,c;
    for(i=s1.size()-1;i>=0;i--)//字符串转数字,倒序存储
        a.push_back(s1[i]-'0');
    for(i=s2.size()-1;i>=0;i--)//字符串转数字,倒序存储
        b.push_back(s2[i]-'0');
    c=add(a, b);//加法法则
    for (i=c.size()-1;i>=0;i--)//输出结果
        cout<<c[i];
    return 0;
}
复制代码

五、测试结果

1.png

猜你喜欢

转载自juejin.im/post/7086996262028836871