【noi】1.6_11大整数减法

[noi]1.6_11大整数减法

总时间限制: 1000ms 内存限制: 65536kB
描述
求两个大的正整数相减的差。

输入
共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。
输出
一行,即所求的差。

样例输入
9999999999999999999999999999999999999
9999999999999
样例输出
9999999999999999999999990000000000000

#include<bits/stdc++.h>
using namespace std;
string stra,strb,strc;
int main(){
	cin>>stra>>strb;
	while(stra.length()>strb.length()){
		strb='0'+strb;
	}
	int jie=10;
	for(int i=stra.length()-1;i>=0;i--){
		if(stra[i]<strb[i]){
			stra[i]=char(stra[i]-'0'+jie+'0');
			stra[i-1]=char(stra[i-1]-'0'-1+'0');//别忘记最后加'0 
		}
		strc=char(stra[i]-'0'-(strb[i]-'0')+'0')+strc;
	}
	//cout<<"strc="<<strc;
	int flag=0,flag1=0;
	for(int i=0;i<=strc.length()-1;i++){
		if(strc[i]=='0' && flag1==0){
			flag=1;
		}else{
			flag=0;
			flag1=1;
			cout<<strc[i];
		}	
	}
	if(flag) cout<<"0";
	
	return 0;
}

总结:

一、还是用把两个数组补齐位数,从最后一位算起开始计算的方法
二、对于字符串类型的数据做加减,要先转换成ASCII计算,如果要把得到的结果再转换成字符型的东西存入原先的字符数组,要再加上’0’转换成ASCII.下面一块代码尤其要注意,刚一开始相减完未加’0’,结果输出来奇怪的符号,把2020年的错误留到了2021年解决。

int jie=10;
	for(int i=stra.length()-1;i>=0;i--){
		if(stra[i]<strb[i]){
			stra[i]=char(stra[i]-'0'+jie+'0');
			stra[i-1]=char(stra[i-1]-'0'-1+'0');//别忘记最后加'0 
		}
		strc=char(stra[i]-'0'-(strb[i]-'0')+'0')+strc;
	}

1000-999,倒数第二位的0,第一位借位后,

stra[i-1]=char(stra[i-1]-'0'-1+'0');//别忘记最后加'0

‘0’-‘0’-1+'0’结果为:0-1+‘0’,-1+48=47,再经过转换变为47对应的字符存入数组,
在这里插入图片描述

i++,执行代码

stra[i]=char(stra[i]-'0'+jie+'0');

-1+10+‘0’,经转换,刚好是’9’.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值