赞
踩
计算需求与C++现状阐述:
在c++中,整型变量有int和long long 。int类型占4个字节,也就是能表示到2的32次方,对应的为10的9次方数量级,,long long类型占8个字节,也就是能表示到2的64次方,对应的为10的18次方数量级,那么如果给定的数字已经远远大于这个数量级,c++中原有的数字变量类型就不够用了,那怎么办呢?
解决方法:
用字符数组模拟大整数的运算,统称高精度运算。
高精度算法现状:
竞赛当中考得较少,目前java和python语言中,都可以直接模拟出高精度算法,那为什么要学呢?
没说一定要学,不会也不影响,高精度运算的底层逻辑就是数学中运算的逻辑,学会了,编码的实现能力肯定能上一层楼。
算法核心:
1.将大整数保存成字符数组后,再转成数字数组。为了方便计算(计算从个位开始,但是保存的字符数组第一位却是最高位),数字数组为逆序。
2.进位需要考虑到。
3.为了申请数组长度的方便,a+b=c,其中a,b,c均定义成动态数组。动态数组自带push_back()意思是数组入栈,size()函数是测量数组的长度。
边界条件考虑:
1.定义tmp变量来保存每位上a与b的相加,tmp的个位数加到c数组,十位数为进位。
2.前置零的情况,比如0001+0002=0003,不能输出0003,只能输出3。对于这种情况用一个变量标记一下就行了。
代码:
#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;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。