同理参照高精度算法-减法篇,一个模板改过来的
解决跟高精度减法不同的问题:
①0与0相加的情况
1 if (s1[0] ==‘0‘ && s2[0] == ‘0‘) 2 return ss += "0";
②没有前导零的存在,但是可能会出现位数增多的情况
比如:9999+9999=19998
int tmp = 0;//与高精度减法不同,这里tmp不再为1,而是为0 解决例如999+1=1000,位数增多且其他位数都为0的情况 while (ans[tmp] == 0) tmp++;
终极代码:
1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 using namespace std; 5 int arr1[200000], arr2[200000], ans[200000]; 6 string jiafa(string s1, string s2) 7 { 8 string ss; 9 if (s1[0] ==‘0‘ && s2[0] == ‘0‘) 10 return ss += "0"; 11 if (s1.length() < s2.length() || (s1.length() == s2.length() && s1 < s2)) 12 { 13 return jiafa(s2, s1); 14 } 15 for (int i = 1; i <= s1.length(); i++) 16 arr1[i] = s1[i - 1] - ‘0‘; 17 for (int i = 1; i <= s2.length(); i++) 18 arr2[i + s1.length() - s2.length()] = s2[i - 1] - ‘0‘;//这里是为了解决长度大的数减去长度小的数 例如89999-9 19 for (int i = s1.length(); i > 0; i--) 20 ans[i] = arr1[i] + arr2[i]; 21 for (int i = s1.length(); i > 0; i--) 22 { 23 if (ans[i]>=10) 24 { 25 ans[i]-=10; 26 ans[i - 1]++; 27 } 28 } 29 int tmp = 0; 30 while (ans[tmp] == 0) 31 tmp++; 32 for (int i = tmp; i <= max(s1.length(), s2.length()); i++) 33 ss += ans[i] + ‘0‘; 34 return ss; 35 } 36 int main() 37 { 38 string s1, s2; 39 cin >> s1 >> s2; 40 cout << jiafa(s1, s2); 41 }
原文:https://www.cnblogs.com/luoyoooo/p/12527566.html