高精度加法的实现

#include<iostream>

#include<vector>

#include<string>

using namespace std;

//写一个用来比较数位大小的函数

bool bi(vector<int>& a, vector<int>& b)

{

 if (a.size() != b.size())

 {

  return a.size() > b.size();//这句话的意思是如果a的数位比b的数位大,那我们就返回真,否则返回假

 }

 else {

  for (int i = a.size() - 1; i >= 0; i--)

  {

   if (a[i] != b[i])

   {

    return a[i] > b[i];//这里是从个位开始比较,如果同位上的数字a比较大,就返回真,否则返回假

   }

  }

 }

 return 0;

}

//接下来是加法函数的实现

vector<int> add(vector<int>& a, vector<int>& b)

{

 vector<int>c;

 int t = 0;//t是用于进位的数

 for (int i = 0; i < a.size() || t != 0; i++)

 {

  if (i < b.size()) {

//这里如果还没遍历完b,我们就对a,b数组同位求和加上进位t取余数作为该位的结果

   c.push_back((a[i] + b[i] + t) % 10);

//这里是把t设置为进位值

   t = (a[i] + b[i] + t) / 10;

  }

  else if (i >= b.size() && i < a.size()) {

//如果遍历完b数组,我们继续遍历a数组,继续上面的操作,不过这时候就要把b数组去掉了

c.push_back((t + a[i]) % 10); t = (t + a[i]) / 10; }

//如果a,b数组都遍历完了,而且还有进位的话,我们最后一位添上进位的值,把t赋值为0,结束加法运算

  else { c.push_back(t); t = 0; }

 }

 return c;

}

int main()

{

 string a, b;

 vector<int>a1, b1;

 vector<int>c;

 cin >> a >> b;

 for (int i = a.size() - 1; i >= 0; i--)

 {

//这里是讲字符数字转化为动态数组中的数字

  a1.push_back(a[i] - '0');

 }

 for (int i = b.size() - 1; i >= 0; i--)

 {

//同理

  b1.push_back(b[i] - '0');

 }

 if (bi(a1, b1))

 {

//判断a,b的大小,如果a大,a就放在前面,

反之,b放在前面

  c = add(a1, b1);

 }

 else { c = add(b1, a1); }

 while (c.size() > 1 && c.back() == 0)

 {

//这里对结果的c数组做一个去掉前导0的操作

  c.pop_back();

 }

 for (int i = c.size() - 1; i >= 0; i--)

 {

//输出最终答案

  cout << c[i];

 }

 return 0;

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值