问题 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;
}
/**/