基本算法-高精度加法 模板+习题

一.高精度加法模板

1.模板

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);
  return C;
}

2.模板讲解

上面模板是C++实现的一个高精度加法函数,让我们先了解一下什么是高精度加法。

高精度加法是一种用于处理非常大的整数运算的方法。在计算机科学中,由于计算机的内存限制,我们不能直接存储非常大的整数。所以,我们需要把大整数分解成多个部分(例如,每一位数字),然后单独处理这些部分。

这个函数的参数是两个vector<int>类型的数组A和B,它们分别代表两个要相加的整数。结果C被存储在一个新的vector<int>中。模板里运用的是c++ STL容器vector(这里就不过多讲解vector,详见可以去其他博客搜索),vector不用担心空间问题,可以自动扩容,比较方便。

函数的实现中,`t`用于存储当前位的和,`A[i]`和`B[i]`分别代表A和B的第i位。如果A或B超出其范围,那么其对应的值就是0。 循环的条件是`i<A.size() || i<B.size()`,这意味着A或B数组都结束,循环都会停止。

对于每个位,我们将`A[i]`和`B[i]`加到`t`上,然后对结果取模10,并将结果加到`C`上。这一步是为了处理进位和计算当前位的值。 最后,如果`t`的值大于0(即存在进位),我们将1添加到`C`的末尾。 这就是高精度加法的基本思想。

另外,这里A和B都是逆序输入,因为有进位,要添加一位(倒序容易实现进位),所以输入和结果要倒序输入或者输出。

看完模板后,快来进入习题练练手吧!

二.习题一

1.题目来源

A+B plus - 蓝桥云课 (lanqiao.cn)

2.题目描述

3.题目讲解

模板题,注意要倒序输入和输出即可。

auto是适配器,自动选择合适的类型,这里C为vector类型。

4.完整代码

#include<bits/stdc++.h>
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);
  return C;
}

int main(){
  string a,b;
  vector<int> A,B;
  cin>>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');
  auto C=add(A,B);
  for(int i= C.size()-1;i>=0;i--) printf("%d",C[i]);
  return 0;
}

三.习题二

1.题目来源

P1601 A+B Problem(高精) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

2.题目描述

 3.题目讲解

模板题,注意要倒序输入和输出即可。

auto是适配器,自动选择合适的类型,这里C为vector类型。

4.完整代码

#include<bits/stdc++.h>
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);
  return C;
}

int main(){
  string a,b;
  vector<int> A,B;
  cin>>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');
  auto C=add(A,B);
  for(int i= C.size()-1;i>=0;i--) printf("%d",C[i]);
  return 0;
}

经过上面两道练习,相信大家已经对此模板熟悉了一些了吧。

算法要勤加练习,快多多去练习吧!

希望大家给作者大大一个赞吧,感谢大家观看。

此模板来源:常用代码模板1——基础算法 - AcWing

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想敲代码的小趴菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值