问题 C: 【高精度】简单高精度减法
时间限制: 1 Sec 内存限制: 64 MB
题目描述
邪狼掌握了简单高精度加法程序的编写后,修罗王要求邪狼写一个简单高精度减法的程序。即求出A-B的值,其中A和B均为非负整数,其位数不超过5000。
输入
共两行数据,第一行为一个非负整数A,第二行为一个非负整数B,A、B的位数均在5000以内。
输出
输出一个整数,即A-B的值。
样例输入
复制样例数据
2 1
样例输出
1
注意a可能小于b
/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>
typedef long long LL;
using namespace std;
char a[5005], b[5005], c[5005], d[5005];
int ans[5005];
bool judge(char a[], char b[]){
int len1 = strlen(a), len2 = strlen(b);
if(len1 < len2) return 1;
if(len1 == len2){
for (int i = 0; i < len1; i++){
if(a[i] < b[i]){
return 1;
}else if(a[i] > b[i]) return 0;
}
}
return 0;
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
scanf("%s %s", c, d);
int flag = 0;
if(judge(c, d) == 1){ // c<d
memcpy(a, d, sizeof(d)), memcpy(b, c, sizeof(c));
flag = 1;
}else{
memcpy(b, d, sizeof(d)), memcpy(a, c, sizeof(c));
}
int lena = strlen(a), lenb = strlen(b);
int cnt = 0;
while(lenb - cnt > 0){
if(a[lena - cnt - 1] - b[lenb - cnt - 1] >= 0){
ans[cnt] = a[lena - cnt - 1] - b[lenb - cnt - 1];
}else{
int t = 1;
while(a[lena - cnt - 1 - t] == '0'){ //哎!!
a[lena - cnt - 1 - t] = '9';
t++;
}
a[lena - cnt - 1 - t]--;
ans[cnt] = a[lena - cnt - 1] - b[lenb - cnt - 1] + 10;
}
cnt++;
}
while(lena - cnt > 0){
ans[cnt] = a[lena - cnt - 1] - '0';
cnt++;
}
while(ans[cnt] == 0 && cnt > 0) cnt--;
if(flag) printf("-");
for (int i = cnt; i >= 0; i--){
printf("%d", ans[i]);
}
printf("\n");
return 0;
}
/**/