打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
华为机试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;
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
程序员面试攻略 5.6面试例题:整数/字符串之间的转换
c++字符串处理函数
华为算法题
java类型之间的转换
剑指offer之字符串的全排列
【算法千题案例】每日LeetCode打卡——68.反转字符串中的元音字母
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服