xd程序设计1:基于一维数组和vector容器实现的高精度加法

高精度计算需要同时满足加减法,减法会比加法稍微麻烦一点,本文我给出两种方法实现加法:

A.一维数组


#include<algorithm>
#include<iostream>
#include<string>
using namespace std;

const int N = 1e5;

int A[N], B[N],C[N];

int main()
{
    string a, b; char c;
    while (cin>>a>>c>>b&&c=='+')
    {
        int cnt1 = 0, cnt2 = 0;

        for (int i = a.size() - 1; i >= 0; i--) A[cnt1++] = a[i] - '0';
        for (int i = b.size() - 1; i >= 0; i--) B[cnt2++] = b[i] - '0';

        int cnt = max(cnt1, cnt2) ,t = 0,j=0;

        for (int i = 0; i < cnt; i++)
        {
           t += A[i] + B[i]; C[j++] = t%10; t /= 10;
        }
        if (t) C[++j] = t;

        for (int i =j-1; i >= 0; i--) cout<<C[i];
    }

    return 0;
}



以上的代码片段,先用两个循环把字符串处理成数组,还使用了algorithm头文件中的max函数用来确定循环次数,也可以自己写一个返回最大值的函数。当然它最核心的是第三个for循环。

画个图更清晰:

每次数组相同位相加时,都会加上上一位进的位,因此使用一个for循环实现。并且需要注意的是,当A和B数组长度相等并且最后一位相加后t需要再进一位时,t/=10后一定为i,加入if(t)语句即可实现再进一位。

B.vector容器

不了解c++stl库的同学可以直接跳过了,笔者更喜欢使用vector。以下代码参考了acwing闫总的算法:

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;

vector<int> add(vector<int>&a, vector<int>& b)
{
    vector<int> c;

    int cnt = max(a.size(), b.size()),t=0;

    for (int i = 0; i < cnt; i++)
    {
        t += a[i] + b[i];

        c.push_back(t%10);

        t /= 10;
    }
   
    if (t) c.push_back(t);

    return c;
}
int main()
{
string a, b; char c;

while (cin >> a >>c >> b&&c==’+’) 
{
        vector<int> A, B;

        for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
        for (int i = b.size() - 1; i >= 0; i--) B.push_back(b[i] - '0');

        vector<int> C = add(A, B);

        for (int i = C.size() - 1; i >= 0; i--) cout << C[i];
    }

    return 0;

与数组的做法大同小异,使用了vector的函数,并且在add函数中传引用作为参数,这样更快。

欢迎各位大佬指出不足之处!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值