九度OJ 1137 浮点数加法

    北大的这道研究生上机真题初看起来很容易实现,先加小数部分,再加整数部分。但是没想到自己实现起来还是花了一个小时才AC掉,有些失望。更多的功夫还是花在了字符串的处理上,即使把小数和整数部分分离。

     题目URL:http://ac.jobdu.com/problem.php?id=1137

     我的AC代码。


#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;

const int Max = 100;
int ia[Max], ib[Max], ta[Max], tb[Max], ic[Max], tc[Max];
char in[Max], t[Max];

int main()
{
	int cases, l1, l2, l3, l4, l;
	cin >> cases;
	while(cases--)
	{
		memset(ic, 0, sizeof(ic)); memset(tc, 0, sizeof(tc));
		memset(ia, 0, sizeof(ia)); memset(ta, 0, sizeof(ta));
		memset(ib, 0, sizeof(ib)); memset(tb, 0, sizeof(tb));
		scanf("%s", in);
		l = strlen(in);
		int i;
		for(i=0; i<l && in[i] != '.'; i++) ia[i] = in[i] - '0';
		l1 = i++;
		for(int j=0; j<l1/2; j++)
		{
			int tem = ia[l1 - 1 - j];
			ia[l1 - 1 - j] = ia[j];
			ia[j] = tem;
		}
		for(; i<l; i++) ta[i-l1-1] = in[i] - '0';
		l2 = l - l1 - 1;
		
		scanf("%s", in);
		l = strlen(in);
		for(i=0; i<l && in[i] != '.'; i++) ib[i] = in[i] - '0';
		l3 = i++;
		for(int j=0; j<l3/2; j++)
		{
			int tem = ib[l3 - 1 - j];
			ib[l3 - 1 - j] = ib[j];
			ib[j] = tem;
		}
		for(; i<l; i++) tb[i-l3-1] = in[i] - '0';
		l4 = l - l3 - 1;
		
		l2 = max(l2, l4);
		int c = 0, temp;
		for(int i=l2-1; i>=0; i--)
		{
			temp = ta[i] + tb[i] + c;
			tc[i] = temp % 10;
			c = temp / 10;
		}
		
		int f;
		for(f=l2-1; f>=0; f--)
			if(tc[f]) break;

		l1 = max(l1, l3);
		for(int j=0; j<=l1; j++)
		{
			temp = ia[j] + ib[j] + c;
			ic[j] = temp % 10;
			c = temp / 10;
		}

		int k;
		for(k=l1; k>=0; k--)
			if(ic[k]) break;
		if(k == -1) l1 = 0;
		else l1 = k;

		for(int j=l1; j>=0; j--) printf("%d", ic[j]);
		if(f != -1)
		{
			printf(".");
			for(int j=0; j<=f; j++) printf("%d", tc[j]);
		}
		printf("\n");
	} 
	system("pause");
	return 0;
}


你可能感兴趣的:(九度OJ 1137 浮点数加法)