高精度减法

题目描述

高精度减法。

输入格式

两个整数 a,b(第二个可能比第一个大)。

输出格式

结果(是负数要输出负号)。

输入输出样例

输入 

2
1

输出 

1

说明/提示

  • 20% 数据 a,b 在 long long 范围内;
  • 100% 数据 0≤a,b≤10^10086。

10的10086次方肯定是超出了long long的数据范围了,所以说,这道题就要用到高精度

高精度请见高精度加法

照常输入(但还是倒序)

string sa,sb;
int a[10087],b[10087];
cin>>sa>>sb;
int la=sa.length();
int lb=sb.length();
for(int i=0;i<la;i++)
	a[la-1-i]=sa[i]-'0';
for(int i=0;i<lb;i++)
	b[lb-1-i]=sb[i]-'0';

 接着就是运算

不过这之前先得做个判断,比较哪个数更大,因为如果后面的数大于前面的数,就得输出个负数

字符串怎么输出负数呢?这其实不难

拿4和7来举个例子

4 - 7 = -3

那把他们倒过来,7-4等于多少——3

这时,我们不拿发现b大于a的情况下,只需要在b-a前面输出a个负号就行了

比较大小用一个函数来解决,从高未开始依次向下比较,只要发现哪一位的那个数就大,运行完还没找到就是相等

int f(int la,int lb){
	if(la>lb)return 0;
	if(lb>la)return 1;
	for(int i=0;i<la;i++){
		if(sa[i]>sb[i])return 0;
		if(sb[i]>sa[i])return 1;
	}
	return 2;
}

如果返回值是0,正常运算(用a-b);如果返回值是1,就用b-a,输出负号,如果相等,输出0

运算过程:

也是按照减法竖式的过程,一步一步地相减,但是提前要做个比较,如果当前位小于减数的当前位,就要向前一位借一当十

if(a[i]<b[i]){
	a[i]+=10;
	a[i+1]-=1;
}

知道了这些,代码就很简单了

不过,这个代码还有缺陷

#include<bits/stdc++.h>
using namespace std;
string sa,sb;
int a[10087],b[10087],c[10087];
int f(int la,int lb){
	if(la>lb)return 0;
	if(lb>la)return 1;
	for(int i=0;i<la;i++){
		if(sa[i]>sb[i])return 0;
		if(sb[i]>sa[i])return 1;
	}
	return 2;
}
int main(){
	cin>>sa>>sb;
	int la=sa.length();
	int lb=sb.length();
	for(int i=0;i<la;i++)
		a[la-1-i]=sa[i]-'0';
	for(int i=0;i<lb;i++)
		b[lb-1-i]=sb[i]-'0';
	int lc=max(la,lb);
	int ff=f(la,lb);
	if(ff==0){
		for(int i=0;i<lc;i++){
			if(a[i]<b[i]){
				a[i]+=10;
				a[i+1]-=1;
			}
			c[i]=a[i]-b[i];
		}
	}
	if(ff==1){
		for(int i=0;i<lc;i++){
			if(b[i]<a[i]){
				b[i]+=10;
				b[i+1]-=1;
			}
			c[i]=b[i]-a[i];
		}
		cout<<"-";
	}
	if(ff==2){
		cout<<0;
		return 0;
	}
	for(int i=lc-1;i>=0;i--)cout<<c[i];//倒序输出
	return 0;
}

比如说我们输入200和199,他会输出001,但要求是1,所以还要做一步操作,去零

while循环,直到不为零

while(1){
	if(c[lc-1]==0){
		lc--;
		continue;
	}
	break;
}

 完整代码为:

#include<bits/stdc++.h>
using namespace std;
string sa,sb;
int a[10087],b[10087],c[10087];
int f(int la,int lb){
	if(la>lb)return 0;
	if(lb>la)return 1;
	for(int i=0;i<la;i++){
		if(sa[i]>sb[i])return 0;
		if(sb[i]>sa[i])return 1;
	}
	return 2;
}
int main(){
	cin>>sa>>sb;
	int la=sa.length();
	int lb=sb.length();
	for(int i=0;i<la;i++)
		a[la-1-i]=sa[i]-'0';
	for(int i=0;i<lb;i++)
		b[lb-1-i]=sb[i]-'0';
	int lc=max(la,lb);
	int ff=f(la,lb);
	if(ff==0){
		for(int i=0;i<lc;i++){
			if(a[i]<b[i]){
				a[i]+=10;
				a[i+1]-=1;
			}
			c[i]=a[i]-b[i];
		}
	}
	if(ff==1){
		for(int i=0;i<lc;i++){
			if(b[i]<a[i]){
				b[i]+=10;
				b[i+1]-=1;
			}
			c[i]=b[i]-a[i];
		}
		cout<<"-";
	}
	if(ff==2){
		cout<<0;
		return 0;
	}
	while(1){
		if(c[lc-1]==0){
			lc--;
			continue;
		}
		break;
	}
	for(int i=lc-1;i>=0;i--)cout<<c[i];
	return 0;
}

 代码很短 希望能帮助到大家

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
题目需要实现精度减法运算,计算a减去b的结果。假设a和b都是非负整数,且位数不超过240位。 精度减法的思路是从个位开始逐位相减,如果当前位被减数小于减数,则向位借位。具体步骤如下: 1. 将a和b转化为字符串,分别保存在字符串变量a_str和b_str中。 2. 创建一个空的列表result,用于保存计算结果。 3. 初始化两个指针i和j,分别指向a_str和b_str的最右边(即个位)。 4. 定义一个变量carry,用于记录借位情况,初始化为0。 5. 从个位开始,依次取a_str和b_str的当前位,并将其转化为整数类型。如果b_str的当前位大于a_str的当前位,则从位借位。具体步骤如下: - 如果b_str的当前位大于a_str的当前位,则将当前位的借位设置为10并将carry设置为1。 - 否则,将借位设置为0,carry设置为0。 6. 将a_str和b_str的当前位数相减,再加上借位,得到当前位的减法结果。 7. 将减法结果转化为字符串,并添加到result列表的最左边。 8. 继续向前移动指针i和j,直到两个字符串遍历完。 9. 将result列表中的所有字符串拼接成一个字符串。 10. 返回最终减法结果。 下面是Python代码实现: ```python def high_precision_subtraction(a, b): a_str = str(a) b_str = str(b) result = [] i = len(a_str) - 1 j = len(b_str) - 1 carry = 0 while i >= 0 or j >= 0: digit_a = int(a_str[i]) if i >= 0 else 0 digit_b = int(b_str[j]) if j >= 0 else 0 if digit_b > digit_a: digit_a += 10 carry = 1 else: carry = 0 subtraction_result = digit_a - digit_b + carry result.insert(0, str(subtraction_result)) i -= 1 j -= 1 return ''.join(result) ``` 通过调用`high_precision_subtraction(a, b)`函数,我们可以得到精度减法的结果。请注意,输入的a和b应该是整数类型。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值