持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情
一、题目
描述:
以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。
输入: "123456789","987654321"
输出: "1111111110"
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
string add(string a, string b)
{
}
int main(int, char*[])
{
cout << "123456789 + 987654321 = " << add("123456789", "987654321") << endl;
cout << "123123 + 456456 = " << add("123123", "456456") << endl;
}
二、分析
由题意可知,由于最大的数最多到8位,而超过8位的数相加就没办法进行计算。
所以通过传入字符串来代表数字,就可以突破8位的限制。
要实现字符串的加法,只需要通过模拟正常加法的流程就可以实现。
正常加法的流程是个位对齐,从个位开始相加,超过10就向前进1,剩下的部分就是个位的数。
而字符串是正序描述数字的,要想从个位开始,就要分两种办法:
1.将字符串倒叙输出一次
2.从字符串尾巴向前遍历,但是由于不确定两个字符串的数量,所以每个字符串要单独索引。
将一个数加完之后,如果有进位和剩余,就需要对进位的没加完的数进行单独的处理。
三、模拟
- 9 + 1 = 10 进1剩0
- 8 + 2 + (进1) = 11 进1剩1
- 7 + 3 + (进1) = 11 进1剩1
- 6 + 4 + (进1) = 11 进1剩1
- 5 + 5 + (进1) = 11 进1剩1
- 4 + 6 + (进1) = 11 进1剩1
- 3 + 7 + (进1) = 11 进1剩1
- 2 + 8 + (进1) = 11 进1剩1
- 1 + 9 + (进1) = 11 进1剩1
- (进1) = 1 进0剩1
四、实现
string add(string a, string b)
{
if(a.size() < b.size()){
swap(a, b);
}
int asize = a.size() - 1, bsize = b.size() - 1;
bool last = false;
string result(a.size(), 0);
for(;;){
int sum = a.at(asize) + b.at(bsize) + (last ? 1 : 0) - 96;
result[asize] = sum % 10 + 48;
last = (sum > 9);
--asize;
--bsize;
if(bsize < 0){
break;
}
}
while (asize >= 0) {
int sum = a.at(asize) + (last ? 1 : 0) - 48;
result[asize] = sum % 10 + 48;
last = (sum > 9);
--asize;
}
if(last){
result = '1' + result;
}
return result;
}
五、结言
字符串大数加法只是一种原理的演示和理解。
创作不易,留个赞再走吧!如果对文章内容有任何指正,欢迎评论!