天天看點

超大整數減法模闆

#include <cstdio>
#include <iostream>
#include <string>

using namespace std;

#define LENGTH 100
#define LAST LENGTH-2

char a[LENGTH], b[LENGTH], result[LENGTH];

bool LessThan(char *a, char *b)
{
	//去除前導'0'
	for (a; *a == '0'; a++);
	for (b; *b == '0'; b++);
	int aLen = strlen(a), bLen = strlen(b);
	if (aLen == bLen)
	{
		for (a, b; *a == *b && *a != '\0'; a++, b++);
		return *a < *b;
	}
	return aLen < bLen;
}

//函數要求minuend大于等于subtraction,difference初始值為0
char *IntegerSubtraction(char *minuend, char *subtrahend, char *difference)
{
	int i, j, k, first;
	for (i = strlen(minuend)-1, j = LAST; i >= 0; i--, j--)
	{
		difference[j] = minuend[i] - '0';
	}
	for (i = strlen(subtrahend)-1, k = LAST; i >= 0; i--, k--)
	{
		difference[k] -= (subtrahend[i] - '0');
	}
	//擷取difference中結果的首位位置
	first = j < k ? j : k;
	for (i = LAST; i >= first; i--)
	{
		if (difference[i] < 0)
		{
			difference[i-1]--;
			difference[i] = difference[i] + 10 + '0';
		}
		else
		{
			difference[i] += '0';
		}
	}
	//去除前導'0'
	while (difference[first] == '0' && first < LAST)
	{
		first++;
	}
	return &difference[first];
}

int main(void)
{
	while (cin>>a>>b)
	{
		memset(result, 0, sizeof(result));
		if (!LessThan(a, b))
		{
			cout<<IntegerSubtraction(a, b, result)<<endl;
		}
		else
		{
			char *pRes = IntegerSubtraction(b, a, result);
			//添加負号
			*--pRes = '-';
			cout<<pRes<<endl;
		}
	}
	return 0;
}
           

繼續閱讀