题目描述
给定两个正整数,计算它们的差,计算结果可能为负数。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
1≤整数长度≤105
样例
输入样例:
32
11
输出样例:
21
数组版
C++ 代码
#include <algorithm>
#include <cstring>
#include <string>
#include <iostream>
#include <cstdio>
using namespace std ;
const int N = 1e5 + 100 ; //定义一下最长数的位数
int x[N],y[N] ; //存输入的两个数
int cmp(int a[],int b[]){ //判断传入大小,前面大就返回1,后面大就返回-1,相等就返回0
for(int i = N - 1 ; i >= 0 ; i--){ //从高位开始比较
if(a[i] > b[i]){ //a大
return 1 ;
}
else if( a[i] < b[i]){ //b大
return -1 ;
}
}
return 0 ; //相等
}
void sub(int a[],int b[]){ //a减去b,结果存在a中
static int c[N] ; //定义辅助数组c
memset(c,0,sizeof c) ; //清空辅助数组
for(int i = 0,t = 0 ; i < N ; i++){ //从低位到高位
t = a[i] - b[i] - t ; //t代表进位
c[i] = (t + 10)%10 ;
if(t < 0) t = 1 ;
else t = 0 ;
}
memcpy(a,c,sizeof c) ; //将c中内容复制到a中
}
void print(int a[]){ //输出结果
int k =N - 1;
while(k && !a[k]) k-- ; //找到不为0的最高位
while(k >=0 ) cout << a[k--] ; //从最高位依次输出
cout << endl;
}
int main(){
string a,b ;
cin >> a >> b ; //用string先以字符串存两个数
reverse(a.begin(),a.end()) ; //逆转
reverse(b.begin(),b.end()) ;
for(size_t i = 0 ; i < a.size() ; i++){ //将字符串赋给数组
x[i] = a[i] - '0' ;
}
for(size_t i = 0 ; i < b.size() ; i++){
y[i] = b[i] - '0' ;
}
if(cmp(x,y) >= 0){ //比较,这里注意相等的话不能输出负号,所以在这个情况中
sub(x,y) ; //大数减小数
print(x) ;
}
else{
sub(y,x) ;
cout << '-' ;
print(y) ;
}
return 0 ;
}