Peter算法小课堂—高精度减法

本文介绍如何使用计算机模拟人类的竖式计算方法实现高精度减法,包括字符串转为大数、大小比较、减法操作和结果输出,以及处理负数和借位的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 给大家看个小视频高精度减法_哔哩哔哩_bilibili

基本思想

计算机模拟人类做竖式计算,从而得到正确答案

大家还记得小学时学的“减法竖式”吗?是不是这样

x-y问题

函数总览:

1.converts() 字符串转为高精度大数

2.le() 判断大小

3.sub() 将两个高精度大数相减

4.print() 输出一个高精度大数(删除前导0)

易错点

1.相减为负数时的处理

2.减法借位的处理

3.删除前导0

main()

int x[SIZE],y[SIZE];
int main(){
	string s1,s2;
	cin>>s1>>s2;
	converts(x,s1);
	converts(y,s2);
	if(le(y,x)){
		sub(x,y);
		print(x);
	}
	else{
		sub(y,x);
		cout<<"-";print(y);
	}
	return 0;
}

le()

bool le(int *a,int *b,int len=SIZE){
	int i;
	for(i=len-1;i>=0&&a[i]==b[i];i--);//判断等于 
	return i<0||a[i]<b[i];
}

方法图示

sub()

void sub(int *a,int *b,int len=SIZE){
	for(int i=0;i<len;i++)
		if((a[i]-=b[i])<0){
			a[i+1]--;
			a[i]+=10;
		}
}

借位图示

代码

#include <bits/stdc++.h>
using namespace std;
#define SIZE 550
int x[SIZE],y[SIZE];
void converts(int *a,string s){
	int i,len=s.size();
	for(i=0;i<len;i++) a[i]=s[len-i-1]-'0';
	for(;i<SIZE;i++) a[i]=0;
}
bool le(int *a,int *b,int len=SIZE){
	int i;
	for(i=len-1;i>=0&&a[i]==b[i];i--);//判断等于 
	return i<0||a[i]<b[i];
}
void sub(int *a,int *b,int len=SIZE){
	for(int i=0;i<len;i++)
		if((a[i]-=b[i])<0){
			a[i+1]--;
			a[i]+=10;
		}
}
void print(int *a){
	int i;
	for(i=SIZE-1;i>0;i--) if(a[i]>0) break;
	for(;i>=0;i--) cout<<a[i];
	cout<<endl;
}
int main(){
	string s1,s2;
	cin>>s1>>s2;
	converts(x,s1);
	converts(y,s2);
	if(le(y,x)){
		sub(x,y);
		print(x);
	}
	else{
		sub(y,x);
		cout<<"-";print(y);
	}
	return 0;
}

希望这些对大家有用,三连必回

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值