华为机试HJ57:高精度整数加法

Posted 翟天保Steven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为机试HJ57:高精度整数加法相关的知识,希望对你有一定的参考价值。

作者:Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

输入两个用字符串表示的整数,求它们所表示的数之和。

字符串的长度不超过10000。

本题含有多组样例输入。

输入描述:

输入两个字符串。保证字符串只含有'0'~'9'字符

输出描述:

输出求和后的结果

示例:

输入:

9876543210
1234567890

输出:

11111111100

解题思路:

本题通过字符串操作实现超高精度的整数加法。首先输入两个字符串,并判断长短,长字符串为被加数,短字符串为加数;设置进位符,按长字符串倒序开始计算,当短字符串当前位大于等于0时,说明当前处于加法阶段,若两数相加大于10,则进位,刷新result字符串;当加法结束后,还要考虑进位,直到进位完全结束,将剩下的长字符串字符补位;最后别忘了分析下进位符状态,若为true,说明长字符串最高位数字还要进一下位,即前面多个1,完成。

测试代码:

#include <iostream>
#include <string>

using namespace std;

string add(string s1, string s2)
{
	string result,Long,Short;
    // 长+短
	if (s1.size() > s2.size())
	{
		Long = s1;
		Short = s2;
	}
	else {
		Long = s2;
		Short = s1;
	}
	int j = Short.size() - 1;
    //进位符
	bool carry = false;
	for (int i = Long.size() - 1; i >= 0; --i)
	{
        // 加法阶段
		if (j >= 0)
		{
			int temp;
			if (carry)
			{
				temp = int(Long[i] - '0') + int(Short[j] - '0') + 1;
			}
			else {
				temp = int(Long[i] - '0') + int(Short[j] - '0');
			}
			if (temp < 10) {
				result = char(temp + '0') + result;
				carry = false;
			}
			else {
				carry = true;
				temp -= 10;
				result = char(temp + '0') + result;
			}
		}
        // 进位阶段
		else if (carry) {
			int temp = int(Long[i] - '0') + 1;
			if (temp < 10) {
				result = char(temp + '0') + result;
				carry = false;
			}
			else {
				carry = true;
				temp -= 10;
				result = char(temp + '0') + result;
			}
		}
        // 补数阶段
		else {
			result = char(Long[i]) + result;
		}
		--j;
	}
    // 若最后一次操作有进位符的话,说明最终字符串还要在前面加个1,进位
    if(carry)
    {
        result="1"+result;
    }
	return result;
}
int main()
{
	string s1, s2;
	while (cin >> s1 >> s2)
	{
		cout << add(s1, s2) << endl;
	}
	return 0;
}

以上是关于华为机试HJ57:高精度整数加法的主要内容,如果未能解决你的问题,请参考以下文章

华为机试HJ9:提取不重复的整数

华为机试HJ33:整数与IP地址间的转换

华为机试HJ97:记负均正

华为机试HJ97:记负均正

华为机试HJ11:数字颠倒

华为机试HJ28:素数伴侣