计算需求与C++现状阐述:
在c++中,整型变量有int和long long 。int类型占4个字节,也就是能表示到2的32次方,对应的为10的9次方数量级,,long long类型占8个字节,也就是能表示到2的64次方,对应的为10的18次方数量级,那么如果给定的数字已经远远大于这个数量级,c++中原有的数字变量类型就不够用了,那怎么办呢?
高精度统一知识:
1.将大整数保存成字符数组后,再转成数字数组。为了方便计算(计算从个位开始,但是保存的字符数组第一位却是最高位),数字数组为逆序。
2.为了申请数组长度的方便,a-b=c,其中a,b,c均定义成动态数组。动态数组自带push_back()意思是数组入栈,size()函数是测量数组的长度。
3.前置零的情况,比如0002+0001=0001,不能输出0001,只能输出1。对于这种情况用一个变量标记一下就行了。
减法算法核心:
1.向前借位的情况需要考虑到。
解决方案是定义tmp变量,用来保存每位上a-b的值,再加上上位有没有借位tmp=tmp+a-b;
保存tmp的个位的绝对值到c数组中,c.push_back((tmp+10)%10);
判断tmp是不是小于0,小于0的情况说明借位了,tmp=-1,用来下一位的计算,没借位的话,tmp=0;
2.为方便a-b计算,默认定义sub(a,b)函数使用的条件为a>=b。所以需要定义一个cmp函数
比较a和b的大小。
比较a和b的大小的策略是先比较两者的长度,数组越长那肯定这个数就越大,再者,如果两者数组一样长,那就从最高位一一往下比较大小。
代码:
#include
#include
#include
using namespace std;
bool cmp(vector &a,vector &b)//比较大小,计算要求大减小
{
if(a.size()!=b.size())//长度要是不相等咋办
return a.size()>b.size();
else for(int i=a.size()-1;i>=0;i--)//a和b长度相等咋办
if(a[i]!=b[i]) return a[i]>b[i];
return true;//到了最后,说明a==b,返回真,cmp判断a>=b 就返回1
}
vector sub(vector &a,vector &b)//做减法
{
vector c;
int tmp=0;//保留借位的备胎变量
for(int i=0;i
{
tmp+=a[i];
if(i
c.push_back((tmp+10)%10);//取tmp的个位的绝对值保存到c中
if(tmp<0) tmp=-1; //要是tmp小于0,说明要往上借位 ,赋-1到下一位计算中减一
else tmp=0;//没借位的 tmp就清零
}
return c;
}
int main()
{
string m,n;
vector a,b,c;
int flag=0;//标记结果是否为负
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');//把字符数组逆向转置成数字数组,方便计算
if(!cmp(a,b))
{
flag=1;
c=sub(b,a);
}
else c=sub(a,b);
if(flag) cout<
int tmp=0;//tmp标记是否有前置零的情况
for(int i=c.size()-1;i>=0;i--)
{
if(c[i]!=0||i==0) tmp=1;
if(tmp) cout<
}
return 0;
}