大整数加减法

大整数加法
大整数减法
本篇将以上两部分内容结合,使之能够真正计算大整数的加减法。
大整数加法介绍了两个正的大整数相加,大整数减法介绍了两个正的大整数相减。

加法

加法有以下情况,它们都可以转换为以上链接讲述的问题:

  • 正 + 正 ,如 1 + 1
  • 正 + 负,如 1 + (-1) = 1 - 1
  • 负 + 正,如 -1 + 1 = 1 - 1
  • 负 + 符,如 -1 + -1 = -(1 + 1)

减法

同理,减法有如下情况:

  • 正 - 正,如:1 - 1
  • 正 - 负,如1 - (-1) = 1 + 1
  • 负 - 正,如 -1 - 1 = -(1 + 1)
  • 负 - 负,-1 - (-1) = 1 - 1
    根据以上规则,有如下代码:
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

void swap(int a[], int len_a, int b[], int len_b)//交换数组
{
	int MAX = max(len_a, len_b);
	for (int i = 0; i < MAX; i++)
	{
		swap(a[i], b[i]);
	}
}

void reverseArr(string A, int a[])//逆序存放
{
	int len = A.length();
	for (int i = len - 1, k = 0; i != -1; i--)
	{
		a[k] = A[i] - '0';
		k++;
	}
}

void largeIntAdd(string A,string B)
{
	int a[1001] = { 0 };
	int b[1001] = { 0 };
	reverseArr(A, a);
	reverseArr(B, b);
	int len_a = A.length();
	int len_b = B.length();

	int up = 0, max = len_a >= len_b ? len_a : len_b;
	for (int i = 0; i < max; i++)//模拟加法
	{
		a[i] += b[i] + up;
		up = a[i] / 10;
		a[i] %= 10;
	}
	if (up > 0)
	{
		a[max] += up;
		max += 1;
	}

	for (int i = max - 1; i >= 0; i--)
	{
		cout << a[i];
	}
	cout << endl;
}

void largeIntSub(string A,string B)
{
	int a[1001] = { 0 };
	int b[1001] = { 0 };
	reverseArr(A, a);
	reverseArr(B, b);
	int len_a = A.length();
	int len_b = B.length();

	int flag = 0;
	int count = 0;
	if (len_a < len_b)
	{
		flag = 1;
		swap(a, len_a, b, len_b);
		swap(len_a, len_b);
	}
	else if (len_a == len_b)
	{
		for (int i = len_a - 1; i >= 0; i--)
		{
			if (a[i] == b[i])
			{
				count++;
				continue;
			}
			else if (a[i] > b[i])
				break;
			else
			{
				flag = 1;
				swap(a, len_a, b, len_b);
				swap(len_a, len_b);
				break;
			}
		}
	}
	if (len_a == len_b && count == len_a)
	{
		cout << 0 << endl;
		return;
	}
	int down = 0, max = len_a >= len_b ? len_a : len_b;
	for (int i = 0; i < max; i++)//模拟减法
	{
		a[i] = a[i] - b[i] - down;
		down = 0;
		if (a[i] < 0)
		{
			down = 1;
			a[i] += 10;
		}
	}
	if (flag)
	{
		cout << "-";
	}
	int i;
	for (i = max - 1; a[i] == 0; i--);//忽略空格
	for (; i >= 0; i--)
	{
		cout << a[i];
	}
	cout << endl;
}

int control(string &A, char op, string &B)//控制调控函数
{
	switch (op)
	{
	case '+':
	{
		if (A[0] == '-'&&B[0] == '-')//负+负 = -(正 + 正)
		{
			A.erase(0, 1);
			B.erase(0, 1);
			cout << "-";
			largeIntAdd(A, B);
		}
		else if (A[0] == '-'&&B[0] != '-')//一负一正
		{
			A.erase(0, 1);
			largeIntSub(B, A);
		}
		else if (A[0] != '-'&&B[0] == '-')//一正一负 
		{
			B.erase(0, 1);
			largeIntSub(A, B);
		}
		else//双正
		{
			largeIntAdd(A, B);
			return 0;
		}
		break;
	}
	case '-':
	{
		if (A[0] != '-')
		{
			if (B[0] != '-')//正 - 正
			{
				largeIntSub(A, B);
			}
			else//正 - 负
			{
				B.erase(0, 1);
				largeIntAdd(A, B);
			}
		}
		else
		{
			if (B[0] != '-')//负 - 正
			{
				A.erase(0, 1);
				cout << "-";
				largeIntAdd(A, B);
			}
			else//负 - 负
			{
				A.erase(0, 1);
				B.erase(0, 1);
				largeIntSub(B, A);
			}
		}
	}
	default:
		return -1;
	}
	return 0;
}
int main()
{
	string A, B;
	char op;
	while (cin >> A >> op >> B)
	{
		control(A, op, B);
	}
}

效果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43894577/article/details/86770733