1.原理
使用的是模拟手算的方法
例如:123456+1234
1 | 2 | 3 | 4 | 5 | 6 | |
---|---|---|---|---|---|---|
+ | 1 | 2 | 3 | 4 | ||
= | 1 | 2 | 4 | 6 | 9 | 0 |
我们手算时都是从最右边开始竖着的那位相加的,依次向左重复竖着相加
2.函数型代码
//s1长度长,s2短
//这里使用引用参数(&)是为了不要再生成s1,s2字符串
void Add(string& s1, string& s2)
{
//使longStr指向长度较长的那个字符串,
//shortStr指向较短的那个字符串
string* longStr, * shortStr;
longStr = s1.length() >= s2.length() ? &s1 : &s2;
shortStr = s1.length() < s2.length() ? &s1 : &s2;
int cnt = 0; //记录进位,初始化为0,无进位
int pos1 = (*longStr).length() - 1, pos2 = (*shortStr).length() - 1, temp; //从字符串最后一位一位一位向前移动,模拟加法
//pos1为长字符串的“指针”,pos2为短字符串的“指针”
while (pos1 >= 0) {
if (pos2 >= 0)
temp = ((*longStr)[pos1] - '0') + ((*shortStr)[pos2--] - '0') + cnt;
else
temp = (*longStr)[pos1] - '0' + cnt;
if (temp > 9)
cnt = 1;
else
cnt = 0;
temp = temp % 10;
(*longStr)[pos1--] = '0' + temp;
}
if (cnt == 1)
(*longStr) = "1" + (*longStr);
return (*longStr);
}
int main()
{
string s1, s2, * p1, * p2;
int len1, len2;
cin >> s1 >> s2;
len1 = s1.length();
len2 = s2.length();
//p1指向长的字符串,p2指向短的字符串
if (len1 > len2)
{
p1 = &s1;
p2 = &s2;
}
else
{
p1 = &s2;
p2 = &s1;
}
//相加
Add(*p1, *p2);
return 0;
}
注意这两句
longStr = s1.length() >= s2.length() ? &s1 : &s2;
shortStr = s1.length() < s2.length() ? &s1 : &s2;
不能同时使用<
或>
号,因为如果两个字符串长度相等时,这两个字符指针会指向同一个字符串。
3.重载+号代码
为了使用方便,一边会选择重构+号,使+能够对字符串进行我们这个高精度正整数加法
//重载+
string operator +(string &s1, string &s2)
{
string* longStr, * shortStr;
longStr = s1.length() >= s2.length() ? &s1 : &s2;
shortStr = s1.length() < s2.length() ? &s1 : &s2;
int cnt = 0; //记录进位,初始化为0,无进位
int pos1 = (*longStr).length() - 1, pos2 = (*shortStr).length() - 1, temp; //从字符串最后一位一位一位向前移动,模拟加法
//pos1为长字符串的“指针”,pos2为短字符串的“指针”
while (pos1 >= 0) {
if (pos2 >= 0)
temp = ((*longStr)[pos1] - '0') + ((*shortStr)[pos2--] - '0') + cnt;
else
temp = (*longStr)[pos1] - '0' + cnt;
if (temp > 9)
cnt = 1;
else
cnt = 0;
temp = temp % 10;
(*longStr)[pos1--] = '0' + temp;
}
if (cnt == 1)
(*longStr) = "1" + (*longStr);
return (*longStr);
}