http://acm.hdu.edu.cn/showproblem.php?pid=1753

Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Problem Description

话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。

Input

本题目包含多组测试数据,请处理到文件结束。 每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。

Output

请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。

Sample Input

1.1 2.9
1.1111111111 2.3444323343
1 1.1

Sample Output

4
3.4555434454
2.1

Problem solving report:

Description: 求两个大位正小数的相加和。

Problem solving: 通过找小数点把输入的每一个数据分成整数部分和小数部分(要考虑到只有整数部分的情况),我们再将整数部分右对齐,采用倒序相加,小数部分如此。小数部分相加的时候,要把位数在后面加“0”保证两个小数部分的位数相同(这个一开始把数组全部重置为0就行了),然后再加,还要考虑小数部分的进位情况,最后输出的时候要把小数部分的“0”去掉。

#include <stdio.h>
#include <string.h>
#define MAX(a, b) (a > b) ? a : b
int main()
{
	char a[410], b[410];
	int lena, lenb, len, k1, k2, k, p;
	int i, j, a1[410], a2[410], b1[410], b2[410];
	while (~scanf("%s%s", a, b))
	{
		memset(a1, 0, sizeof(a1));
		memset(a2, 0, sizeof(a2));
		memset(b1, 0, sizeof(b1));
		memset(b2, 0, sizeof(b2));
		k1 = lena = strlen(a);
		k2 = lenb = strlen(b);
		for (i = 0; i < lena; i++)
		{
			if (a[i] == '.')
			{
				k1 = i;
				break;
			}
		}
		for (j = 0; j < lenb; j++)
		{
			if (b[j] == '.')
			{
				k2 = j;
				break;
			}
		}
		for (i = k1 - 1; i >= 0; i--)
		    a1[k1 - i - 1] = a[i] - '0';
		for (j = k2 - 1; j >= 0; j--)
		    b1[k2 - j - 1] = b[j] - '0';
		for (i = k1 + 1; i < lena; i++)
		    a2[i - k1 - 1] = a[i] - '0';
		for (j = k2 + 1; j < lenb; j++)
		    b2[j - k2 - 1] = b[j] - '0';
		k = MAX(lena - k1 - 1, lenb - k2 - 1);
		for (i = k - 1; i > 0; i--)
		{
			a2[i] += b2[i];
			if (a2[i] > 9)
			{
				a2[i] -= 10;
				a2[i - 1]++;
			}
		}
		a2[0] += b2[0];
		if (a2[0] > 9)
		{
			a2[0] -= 10;
			a1[0]++;
		}
		p = k;
		for (i = k - 1; i >= 0; i--)
		{
			if (a2[i])
			{
			    p = i;
			    break;
			}
		}
		len = MAX(k1, k2);
		for (i = 0; i < len; i++)
		{
			a1[i] += b1[i];
			if (a1[i] > 9)
			{
				a1[i] -= 10;
				a1[i + 1]++;
			}
		}
		for (i = len; i >= 0; i--)
		{
			if (!(i - len) && !a1[len])
			    continue;
			printf("%d", a1[i]);
		}
		if (p != k)
		{
			printf(".");
			for (i = 0; i <= p; i++)
			    printf("%d", a2[i]);
		}
		printf("\n");
	}
	return 0;
}