zoukankan      html  css  js  c++  java
  • 49 实数相加

    49 实数相加

    作者: Turbo时间限制: 1S章节: 基本练习(字符串)

    问题描述 :

      计算两个实数相加的结果。
      输入的实数满足如下要求: (1)  小数点前的整数部分最多100位,(2) 小数点后的小数部分最多100位.

    输入说明 :

      两行字符串,每行都是一个合法的实数。合法的意思是指:  整数部分的值如果大于零,则最高位数字必定大于零. 如果整数部分的值为零,则整数部分只有一个零. 小数部分尾部可以有任意多的零. 可以没有小数部分,  此时也没有小数点. 如果有小数点, 则至少需要有一位小数部分, 且允许是零.

    输出说明 :

      相加结果。注意: 小数部分末尾如果有连续的0, 则它们都是有效数字,  不能舍去. 如果是两个整数相加, 则结果仍为整数而没有小数部分.

    输入范例 :
    999999999991.001
    8.99999999999999999999999
    输出范例 :
    1000000000000.00099999999999999999999

    #include <iostream>
    #include <string>
    #include <algorithm>
    using namespace std;
    string add1(string s1, string s2) {
    	int len1 = s1.length(), len2 = s2.length();
    	if (len1 < len2) {
    		string t(len2 - len1, '0');
    		s1 = t + s1;
    	}
    	else if (len2 < len1) {
    		string t(len1 - len2, '0');
    		s2 = t + s2;
    	}
    	string ans = s1;
    	int car = 0;
    	for (int i = s1.length() - 1; i >= 0; i--) {
    		ans[i] = (s1[i] - '0' + s2[i] - '0' + car) % 10 + '0';
    		car = (s1[i] - '0' + s2[i] - '0' + car) / 10;
    	}
    	if (car) ans = (char)(car + '0') + ans;
    	return ans;
    }
    string add2(string s1, string s2) {
    	int len1 = s1.length(), len2 = s2.length();
    	if (len1 < len2) {
    		string t(len2 - len1, '0');
    		s1 = s1 + t;
    	}
    	else if (len2 < len1) {
    		string t(len1 - len2, '0');
    		s2 = s2 + t;
    	}
    	string ans = s1;
    	int car = 0;
    	for (int i = s1.length() - 1; i >= 0; i--) {
    		ans[i] = (s1[i] - '0' + s2[i] - '0' + car) % 10 + '0';
    		car = (s1[i] - '0' + s2[i] - '0' + car) / 10;
    	}
    	if (car) ans = (char)(car + '0') + ans;
    	return ans;
    }
    int main() {
    	string a, b;
    	while (cin >> a >> b) {
    		string a1, a2, b1, b2;
    		int i, j;
    		for (i = 0; i < a.length() && a[i] != '.'; i++);
    		for (j = 0; j < b.length() && b[j] != '.'; j++);
    		a1 = a.substr(0, i);
    		b1 = b.substr(0, j);
    
    		if (i == a.length()) a2 = "";
    		else a2 = a.substr(i + 1, a.length() - i - 1);
    		if (j == b.length())b2 = "";
    		else b2 = b.substr(j + 1, b.length() - j - 1);
    
    		string ans1 = add1(a1, b1);
    		string ans2 = add2(a2, b2);
    
    		if (ans2.length() > max(a2.length(), b2.length())) {
    			ans2 = ans2.substr(1, ans2.length() - 1);
    			ans1 = add1(ans1, "1");
    		}
    		if (ans2.length() > 0) ans2 = "." + ans2;
    		cout << ans1 << ans2 << endl;
    	}
    	return 0;
    }
    
    Yesterday is history,tomorrow ismystery,but today is a gift!That why it is called Present!
  • 相关阅读:
    软件架构感悟.
    浏览器缓存技术
    as到底干嘛了???
    关于WebForm开发问题(给新手的建议)
    疑难问题ASP.NET
    破解hash算法.高手请进,求解.
    (MVC和JVPL模式)Moon.Web架构谈
    Moon.NET框架架构及介绍
    调用API设置安卓手机的Access Point
    gtShell 为你常用的目录建立标签并快速跳转
  • 原文地址:https://www.cnblogs.com/VictorierJwr/p/12864743.html
Copyright © 2011-2022 走看看