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

计算需求与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的大小的策略是先比较两者的长度,数组越长那肯定这个数就越大,再者,如果两者数组一样长,那就从最高位一一往下比较大小。

代码:

d8550d9a748f1ad25ff950cce7543279.png

21befb14489fe00ab7216e2797675374.png

#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;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值