[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’.