NOIP複習內容:高精度減法

傳送門:luogu

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#define N 40000006

using namespace std;

inline int wread(){
	char c(getchar ());int wans(0),flag(1);
	while (c<'0' || c>'9'){if (c=='-') flag=-1;c=getchar ();}
	while (c>='0' && c<='9'){wans=wans*10+c-'0';c=getchar ();}
	return wans*=flag;
}

char a[N],b[N];
int F,lena,lenb;
char pr[N];

void get_ans (char A[],char B[]){
	for (int i(1);i<=lenb;++i){
		int res = A[i] - B[i];
		int lin (i+1);
		while (res < 0)	{
			res +=10;
			while ( A[lin]-1 < '0' )	A[lin] ='9',lin++;
			A[lin] --;
		}
		pr[i] = res + '0' ;
	}
	for (int i(lenb+1);i<=lena;++i)
		pr[i] = A[i];
	reverse (pr+1,pr+lena+1);
	int st(1);
	while (pr[st] == '0')	st++;
	for (int i(st);i<=lena;++i){
		printf("%c",pr[i]);
	}
}

int main (){
//	cout << (sizeof(a)+sizeof (b)+sizeof (pr))*1.0/1024.0/1024.0 << endl;
	scanf ("%s",a+1);
	scanf ("%s",b+1);
	lena = strlen (a+1),lenb = (strlen (b+1));
	if (lena > lenb)	F=1;
	else if (lenb > lena)	F=2;
	else {
		for (int i(1);i<=lena;++i){
			if (a[i] > b[i])	{F=1;break;}
			else if (a[i] < b[i])	{F=2;break;}
		}
	}
	reverse (a+1,a+lena+1);
	reverse (b+1,b+lenb+1);
//	cout << F << endl;
	if (!F)	{puts ("0");return 0;}
	if (F==1){
		get_ans(a,b);
	}
	else {
		putchar ('-');
		swap (lena,lenb);
		get_ans (b,a);	
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章