题目1003:A+B 使用大数相加方法解法

题目描述:
给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开。
现在请计算A+B的结果,并以正常形式输出。

输入:
输入包含多组数据数据,每组数据占一行,由两个整数A和B组成(-10^9 < A,B < 10^9)。

输出:
请计算A+B的结果,并以正常形式输出,每组数据占一行。

样例输入:
-234,567,890 123,456,789
1,234 2,345,678
样例输出:
-111111101
2346912
来源:
2010年浙江大学计算机及软件工程研究生机试真题
答疑:
解题遇到问题?分享解题心得?讨论本题请访问: http://t.jobdu.com/thread-7727-1-1.html

使用大数相加方法如下(本题目也可以使用简单的转化成整形数字然后相加方法,不必像大数相加这么繁琐):
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>

using std::swap;
using std::max;

char sa[20];
char sb[20]; char sc[20];
int a[10]; int b[10]; int c[10];

int StingToInt(char a[], int b[], int& sign)
{
	int i;
	int j;

	if (a[0] == '-')
	{
		sign = -1;
		j = 0;
	}
	else
	{
		sign = 1; b[0] = a[0] - '0'; j = 1;
	}

	for (i = 1; a[i]; i++)
	{
		if (a[i] != ',')
		{
			b[j] = a[i] - '0';
			j++;
		}
	}

	i = 0;
	int k = j - 1;

	while (i < k)
	{
		swap(b[i], b[k]);
		i++;
		k--;
	}
	return j;
}

void IntToString(int a[], int length, int sign, char b[])
{
	int i, j;

	if (sign == 1) { j = 0; }
	else { b[0] = '-'; j = 1; }

	for (i = length - 1; i >= 0;i--, j++)
	{
		b[j] = a[i] + '0';
	}

	b[j] = '\0';
}

int
Compare(int a[], int lengthA, int b[], int lengthB)
{
	if (lengthA > lengthB) return 1;

	if (lengthA < lengthB) return -1;

	int i;

	for (i = lengthA - 1; (i >= 0) && (a[i] == b[i]); i--);

	if (i >= 0)
	{
		if (a[i] > b[i])
		{
			return 1;
		}
		else
		{
			return -1;
		}
	}
	else
	{
		return 0;
	}
}

// |a| >= |b|
int BigAdd(int a[], int lengthA, int signA, int b[], int lengthB, int signB, int c[], int M)
{
	bool add = (signA == signB);
	int length = (lengthA > lengthB) ? lengthA : lengthB;
	int advance = 0;
	int i;

	for (i = 0;i <= length;i++)
	{
		int valueA = (i < lengthA) ? a[i] : 0;
		int valueB = (i < lengthB) ? (add ? b[i] : (0 - b[i])) : 0;
		int value = valueA + valueB + advance;

		if (add)
		{
			if (value < M)
			{
				c[i] = value;
				advance = 0;
			}
			else
			{
				c[i] = value - M; advance = 1;
			}

		}

		else
		{
			if (value >= 0)
			{
				c[i] = value;
				advance = 0;
			}
			else
			{
				c[i] = value + M; advance = -1;
			}
		}
	}

	i--;

	while (i >= 0 && c[i] == 0)i--;

	return max(i + 1, 1);
}

int main()
{
	while (scanf("%s%s", sa, sb) != EOF)
	{
		int signA, signB, sign;

		int lengthA = StingToInt(sa, a, signA);

		int lengthB = StingToInt(sb, b, signB);

		int length;

		if (signA == signB)
		{
			sign = signA;
			length = BigAdd(a, lengthA, signA, b, lengthB, signB, c, 10);
		}
		else
		{
			int compare = Compare(a, lengthA, b, lengthB);

			switch (compare)
			{
			case 1:
				sign = signA;
				length = BigAdd(a, lengthA, signA, b, lengthB, signB, c, 10);
				break;
			case -1:
				sign = signB;
				length = BigAdd(b, lengthB, signB, a, lengthA, signA, c, 10);
				break;
			case 0:
				sign = 1;
				c[0] = 0;
				length = 1;
				break;
			}

		}

		IntToString(c, length, sign, sc);
		printf("%s\n", sc);
	}

	return 0;
}



/**************************************************************

Problem: 1003

User: phoenix198425

Language: C++

Result: Accepted

Time:0 ms

Memory:1020 kb

****************************************************************/



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值