您的位置:首页 > 其它

超大整数减法模板

2012-11-29 18:25 316 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: