题目 带符号的大整数相减
题目描述
给定两个不超过200位的大整数(200位包含符号位。正整数和0可以带符号,也可以不带符号),计算其差值(前面的值-后面的值)。
关于输入
第1行输入 n ,表示后面有 n 组数。
之后,每组数依次占两行,表示被减数与减数;相邻的两组数之间隔一行。
关于输出
逐行输出相减的结果(若结果不为0,最高位不能是0;若结果为非负整数,不能带符号)。
例子输入
-567123
-545012
121346
-17623
+12341
2346789
-21346
+87623
-0
-9876543210
例子输出
-22111
138969
-2334448
-108969
9876543210
提示信息
结果的最高位不能是 0,除非结果为0
解题分析
所谓大整数,就是指这个数字可以很大,甚至大到超过了int,long int和long long int类型的数据所能表示的最大范围,所以本题要用到字符串进行操作,显然,c++中的string类型更加方便,所以考虑采用string即字符串类型来帮助我们解题,并且实现对大整数的每一位进行操作。然后,我们要知道如何从字符转化为数字,比如字符'0'怎么变成数字0呢?答案是用字符'0'减去'0',同理,我们可以将字符'9'减去'0'来获得数字9,这是因为字符在c语言中都是以整数类似(ascii码)来存储的。接下来请看代码实现部分,我会写出大整数相减函数,大整数相加函数以及删除前导0函数,这三个函数是本题的精髓,也希望大家能够熟练地书写并且掌握。
代码实现
#include <bits/stdc++.h>
using namespace std;
string removeZeros(string &s1){
string s=""; int i=0;
int len=s1.size();
for(int i=0;i<len;i++){
if(s1[i]!='0'){
s=s1.substr(i);
break;
}
}
if(s=="") return "0";
else return s;
}
string add(string &s1,string &s2){
int lens1=s1.size(),lens2=s2.size();
while(lens1<lens2){
s1='0'+s1;
lens1++;
}
while(lens2<lens1){
s2='0'+s2;
lens2++;
}
int carry=0; string result="";
for(int i=lens1-1;i>=0;i--){
int temp=(s1[i]-'0')+(s2[i]-'0')+carry;
carry=temp/10;
temp%=10;
result=(char)(temp+'0')+result;
}
if(carry) result='1'+result;
return removeZeros(result);
}
string subtract(string &s1,string &s2){
int lens1=s1.size(),lens2=s2.size();
while(lens1<lens2){
s1='0'+s1;
lens1++;
}
while(lens2<lens1){
s2='0'+s2;
lens2++;
}
int carry=0; string result="";
for(int i=lens1-1;i>=0;i--){
int temp=(s1[i]-'0')-(s2[i]-'0')-carry;
if(temp<0){
temp+=10; carry=1;
}
else{
carry=0;
}
result=(char)(temp+'0') + result;
}
if(carry){
result=subtract(s2,s1);
return '-'+ removeZeros(result);
}
return removeZeros(result);
}
int main(){
int n; cin>>n;
string s1,s2;
while(n--){
cin>>s1>>s2;
string s; bool s1neg=0,s2neg=0;
if(s1[0]=='-') {s1neg=1;s1=s1.substr(1);}
if(s2[0]=='-') {s2neg=1;s2=s2.substr(1);}
if(s1[0]=='+') s1=s1.substr(1);
if(s2[0]=='+') s2=s2.substr(1);
if(s1neg && s2neg){
cout<<subtract(s2,s1)<<endl;
}
else if(s1neg && !s2neg){
cout<<'-'<<add(s1,s2)<<endl;
}
else if(!s1neg && !s2neg){
cout<<subtract(s1,s2)<<endl;
}
else{
cout<<add(s1,s2)<<endl;
}
}
return 0;
}