高精度加法(c++)

由于存储数据有限,对于大数据没有办法直接存储,所以选择使用数组进行存储与计算较大的数据。此处使用的vector容器。

1.数据的输入与存储

 我们选择用string进行数据的输入存储,vector进行存储计算,例如计算11+23;如下图:

 

string s,t;
    cin>>s>>t;

创建了两个string 类变量 s和t,分别将11和23输入到s和t中。

下一步就是利用s.size()和t.size()计算长度,然后将其存储到vector中

    string s,t;
    cin>>s>>t;

    vector<int> a,b;
    
    for(int i=s.size()-1;i>=0;i--) a.push_back(s[i]-'0');
    for(int i=t.size()-1;i>=0;i--) b.push_back(t[i]-'0');

 注意:

  1. 这里string存的是char类型的'0' '1'等(ascll码),所以在push_back输入时,要减去'0'。
  2. 为什么要从s.size()-1开始循环?因为这样循环可以将数据按照个位、十位、百位的顺序存到vector中,方便后续的相加运算。例如23,存的时候我们就可以存成3 2。

 2.数据的相加

auto c=add(a,b);

1.利用auto,让其帮助我们判断变量c的数据类型。

2.调用我们自己写的add函数进行相加操作,传进去的参数是两个vector,a和b。

 再来看add函数的部分

vector<int> add(vector<int>&A,vector<int>&B)
//开头我们利用引用,给传进来的参数起了个别名,这样不用浪费空间在复制两个vector
{
    vector<int> c;
    int t=0;
//t用来进行每一位的相加。例如11+23中个位1+3=4,存到t中,再次循环,十位1+2=3,存到t中。

    for(int i=0;i<A.size()||i<B.size();i++)
    {
        if(i<A.size())t+=A[i];
        if(i<B.size())t+=B[i];
        c.push_back(t%10);
        t/=10;
    }
    if(t)c.push_back(1);
    while(c.size()>1&&c.back()==0) c.pop_back();
    return c;
}
  1. 判断条件为什么是i<A.size() || i<B.size() ?   假如,当我们计算110+23时,两个容器长度就会不同,由于我们是按位数计算,我们要确保每一位都能被加上。这时就衔接到下方的if语句。当分别算完t=0+3,t=1+2时,110中还剩百位的1没有处理。使用这样的循环判断条件,就能让我们继续对剩下的数据进行处理。
  2. 像c中输入数据为什么要t%10,当我们计算例如9+7这样的数时,t=16;此时我们进行t%10,这样就只把6存到了vector中。
  3. 再进行t/=10,将16末尾的6删去,使得t=1,在下次循环中,将其作为进位的1进行相加。
  4. if(t)c.push_back的作用是什么? 我们知道,两个 个位数相加它的和一定不会超过20,当我们算到最后时,如果仍需要向前进一位,那肯定是进一位1。就像99+11,算到最后,t=9+1+1=11,t%10将1输入到vector中,再进行t/=10,t=1。这时就需要向前进位,进1。
  5. 下方while语句的作用,去除前导0。
  6. 最后返回这个vector c

 3.计算后结果的输出

 

    string s,t;
    cin>>s>>t;
    vector<int> a,b;
    
    for(int i=s.size()-1;i>=0;i--) a.push_back(s[i]-'0');
    for(int i=t.size()-1;i>=0;i--) b.push_back(t[i]-'0');

    auto c=add(a,b);

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

输出也是倒着从容器末尾开始输出,例如计算11+23后结果为 3 4,但在c中存储为 4 3,所以从其末尾输出。

 4.全部代码

#include <iostream>
#include <vector>
using namespace std;
vector<int> add(vector<int>&A,vector<int>&B)
{
    vector<int> c;
    int t=0;
    for(int i=0;i<A.size()||i<B.size();i++)
    {
        if(i<A.size())t+=A[i];
        if(i<B.size())t+=B[i];
        c.push_back(t%10);
        t/=10;
    }
    if(t)c.push_back(1);
    while(c.size()>1&&c.back()==0) c.pop_back();
    return c;
}
int main()
{
    string s,t;
    cin>>s>>t;
    vector<int> a,b;
    
    for(int i=s.size()-1;i>=0;i--) a.push_back(s[i]-'0');
    for(int i=t.size()-1;i>=0;i--) b.push_back(t[i]-'0');
    auto c=add(a,b);
    for(int i=c.size()-1;i>=0;i--)
    cout<<c[i];
    return 0;
}

 

 

2022/11/10 21:26

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值