华为机试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:高精度整数加法的主要内容,如果未能解决你的问题,请参考以下文章