高精度数值处理减法

高精度减法可以类比加法,模拟竖式计算。要点不多,主要注意各数位对齐,小数减大数向高位借一。

一、定义数组

这一步不用多说,需要被减数A、减数B、借位存储C、差Ans四个数组,以及A的长度Len_A、B的长度Len_B、商的长度Len_Ans。

const int MAXN=10005;
int A[MAXN],B[MAXN],C[MAXN],Ans[MAXN],Len_A,Len_B,Len_Ans;

二、读入数据

这里我定义了一个函数,将数据用string类型输入,然后反向存储到数组中。

void Read(int *A,int &Len){
    string cur;
    cin>>cur;
    len=cur.length();
    for(int i=0;i<len;i++)A[i]=cur[i]-48;
    reverse(A,A+Len);//reverse函数是C++中的翻转函数,传入的两个参数代表反转的左闭右开区间。
    
}

三、减法操作

首先在A的长度与B的长度中选出一个最大值,作为差的长度。

然后循环进行减法、借位操作。

Len_Ans=max(Len_A,Len_B);
for(int i=0;i<Len_Ans;i++){
	Ans[i]=A[i]-B[i]-C[i];
	if(Ans[i]<0)c[i+1]++,Ans[i]+=10;//借位操作 
}

四、删除前导零&&输出

while循环判断最后一位是否为零,差的长度减一。

for循环输出

while(Len_Ans>1&&Ans[Len_Ans-1]==0)//判断位数是否减少
    Len_Ans--;

​for(int i=Len_Ans-1;i>=0;i--)
    cout<<Ans[i];

 代码展示

#include<bits/stdc++.h>
using namespace std;
const int MAXN=10005;
int A[MAXN],B[MAXN],C[MAXN],Ans[MAXN],Len_A,Len_B,Len_Ans;
void Read(int *A,int &Len){
	string sur;
	cin>>sur;
	Len=sur.length();
	for(int i=0;i<Len;i++)A[i]=sur[i]-48;
	reverse(A,A+Len);
}
int main(){
	Read(A,Len_A);
	Read(B,Len_B);
	Len_Ans=max(Len_A,Len_B);
	for(int i=0;i<Len_Ans;i++){
		Ans[i]=A[i]-B[i]-C[i];
		if(Ans[i]<0)C[i+1]++,Ans[i]+=10; 
	}
	while(Len_Ans>1&&Ans[Len_Ans-1]==0)Len_Ans--;
	
	for(int i=Len_Ans-1;i>=0;i--){
		cout<<Ans[i];
	} 
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值