BigNums 之 hdu 1753

WA了几次,考虑不是很周全啊尴尬。。。。

//  [4/7/2014 Sjm]
/*
推荐测试用例:
1 99999
注意:
1) 小数点左面部分 倒序 存储进数组
2) 小数点右边部分 正序 存储进数组
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX = 405;

int myInit_lef(string str, int myStart, int myArr[])
{
	int pos = 0;
	for (; myStart >= 0; myStart--){
		myArr[pos++] = str[myStart] - '0';
	}
	return pos;
}

int myInit_rig(string str, int myStart, int myArr[])
{
	int pos = 0;
	for (int i = myStart; i < str.size(); i++) {
		myArr[pos++] = str[i] - '0';
	}
	return pos;
}

int main()
{
	//freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
	string str1, str2;
	while (cin >> str1 >> str2)
	{
		int myLef_1[MAX], myLef_2[MAX], myRig_1[MAX], myRig_2[MAX];
		memset(myLef_1, 0, sizeof(myLef_1));
		memset(myLef_2, 0, sizeof(myLef_2));
		memset(myRig_1, 0, sizeof(myRig_1));
		memset(myRig_2, 0, sizeof(myRig_2));
		int pos1 = 0, pos2 = 0; // 设初值为 0,不可能出现 '.' 在 0 位置
		// 寻找 '.' 位置
		for (int i = 0; i < str1.size(); i++) {
			if ('.' == str1[i])
				pos1 = i;
		}
		for (int i = 0; i < str2.size(); i++) {
			if ('.' == str2[i])
				pos2 = i;
		}
		// 若出现 pos1 或 pos2 == 0, 此时并非小数,可视为整数
		if (pos1 == 0) pos1 = str1.size();
		if (pos2 == 0) pos2 = str2.size();
		int lef_1_len, lef_2_len, rig_1_len, rig_2_len;
		// 小数点左面部分 倒序 存储进数组,eg: 123.456   存储: 321
		// 小数点右边部分 正序 存储进数组,eg: 0.123     存储: 123
		lef_1_len = myInit_lef(str1, pos1 - 1, myLef_1);
		rig_1_len = myInit_rig(str1, pos1 + 1, myRig_1);
		lef_2_len = myInit_lef(str2, pos2 - 1, myLef_2);
		rig_2_len = myInit_rig(str2, pos2 + 1, myRig_2);
		int temp = 0, myLef, myRig;
		myLef = max(lef_1_len, lef_2_len);
		myRig = max(rig_1_len, rig_2_len);
		string str = "";
		for (int i = myRig - 1; i >= 0; i--) {  
			// 小数点右边部分从数组最后一位开始计算 (因为正序存储)
			temp = myRig_1[i] + myRig_2[i] + temp;
			str = char('0' + (temp % 10)) + str;
			temp = temp / 10;
		}
		str = '.' + str;
		for (int i = 0; i < myLef; i++) {
			// 小数点左面部分从数组第一位开始计算 (因为倒序存储)
			temp = myLef_1[i] + myLef_2[i] + temp;
			str = char('0' + temp % 10) + str;
			temp = temp / 10;
		}
		if (temp) str = char('0' + temp) + str; // 判断是否需要进位
		int myend = str.size() - 1;
		while (str[myend] == '0' || str[myend] == '.') { 
			// 若含 '.' 且计算结果最后含 0,则进行去零操作
			if (str[myend] == '.') { myend--; break; }
			myend--;
		}
		for (int i = 0; i <= myend; i++)
			printf("%c", str[i]);
		printf("\n");
	}
	return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值