编程的50种基础算法_C++编程基础算法高精度加法

计算需求与C++现状阐述:

在c++中,整型变量有int和long long 。int类型占4个字节,也就是能表示到2的32次方,对应的为10的9次方数量级,,long long类型占8个字节,也就是能表示到2的64次方,对应的为10的18次方数量级,那么如果给定的数字已经远远大于这个数量级,c++中原有的数字变量类型就不够用了,那怎么办呢?

988d89158c2dbbbf182f5e720d61baf0.png

解决方法:

用字符数组模拟大整数的运算,统称高精度运算。

高精度算法现状:

竞赛当中考得较少,目前java和python语言中,都可以直接模拟出高精度算法,那为什么要学呢?

没说一定要学,不会也不影响,高精度运算的底层逻辑就是数学中运算的逻辑,学会了,编码的实现能力肯定能上一层楼。

算法核心:

1.将大整数保存成字符数组后,再转成数字数组。为了方便计算(计算从个位开始,但是保存的字符数组第一位却是最高位),数字数组为逆序。

2.进位需要考虑到。

3.为了申请数组长度的方便,a+b=c,其中a,b,c均定义成动态数组。动态数组自带push_back()意思是数组入栈,size()函数是测量数组的长度。

 f92c1e68cdf1d903f5daf0c73f40fef7.png

边界条件考虑:

1.定义tmp变量来保存每位上a与b的相加,tmp的个位数加到c数组,十位数为进位。

2.前置零的情况,比如0001+0002=0003,不能输出0003,只能输出3。对于这种情况用一个变量标记一下就行了。

 9c4725654bbc652e99afb6904d316e94.png

代码:

#include

#include

#include

using namespace std;

vector add(vector &a,vector &b)//加法

{

vector c;

int tmp=0;//定义tmp变量保存临时的相加数,看到tmp变量就应该知道这就是个备胎

for(int i=0;i

{

if(i

if(i

c.push_back(tmp%10);//个位数取余加到c数组当中去

tmp/=10; //tmp只取十位数,保存下一位的进位

}

if(tmp) c.push_back(tmp);//如果tmp变量最后不为0,说明两数相加,位数比以前多一位,所以也要加上c数组当中去。

return c;

}

int main()

{

string m,n;

vector a,b,c;//定义动态数组

cin>>m>>n;

for(int i=m.length()-1;i>=0;i--)//从个位开始将字符转置到数字

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

for(int i=n.length()-1;i>=0;i--)//从个位开始将字符转置到数字

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

c=add(a,b);

int tmp=0;//tmp赋初值等于0

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

{

if(c[i]!=0||i==0) tmp=1;//利用tmp来去掉前置0的情况

if(tmp)

 cout<

}

return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值