P1601 A+B Problem(高精)
分析
简单易懂, 就是在靠高精度大数加法, 很久前(假期的时候)学习过这个知识点, 但很久没用有点忘记了(主要是忘记步骤), 而且也新学习了C++的string类, 故用新的方法重新做一次这道题
先放代码(注: 使用string实现高精度运算的思路来自洛谷题解https://www.luogu.com.cn/blog/user28954/solution-p1601,在此表示感谢!)
代码实现
#include<string>
#include<iostream>
#include<cstdio>
using namespace std;
string add(string str1, string str2)
{
string str;
int len1 = str1.length();
int len2 = str2.length();
if(len1<len2)
{
for(int i=1; i<=len2-len1; i++)
str1 = "0" + str1;
}
else
{
for(int i=1; i<=len1-len2; i++)
str2 = "0" + str2;
}
len1 = str1.length();
int cf=0;
int temp;
for(int i=len1-1; i>=0; i--)
{
temp = str1[i]-'0'+str2[i]-'0'+cf;
cf = temp/10;
temp %= 10;
str = char(temp+'0') + str;
}
if(cf!=0) str = char(cf+'0') + str;
return str;
}
int main(void)
{
string str1, str2;
cin >> str1 >> str2;
cout << add(str1,str2) << endl;
return 0;
}
收货与反思
- 最重要的还是先把大数加法的步骤屡清楚, 之后估计基本都是使用string进行大数模拟了, 随着学习的深入, 越来越觉得除了背下来的板子, 一个算法的思路步骤是很重要的, 有了思路代码便很容易实现.
①. 将要进行相加的两个数的位数补齐(用’0’补齐);
②. 从两个数的最低位数开始依次相加(注意减去’0’并加上上一位的进位)
③. 求当前是否有进位, 并将其插入str字符串的头位置
④. 循环结束后判断是否仍剩余进位, 有之则处理
⑤. 返回求得的str字符串 - 其次就是关于string的认识再一次加深了, string不只可以作为函数的参数, 甚至可以作为函数的返回值! 可以说相比与字符数组越来越觉得string类的方便之处了
- 最近在学习JAVA, 初识"类"的概念和使用, 感觉对学习C++的类也有很大的帮助. 之前说过向字符串string末尾添加字符使用.append或用"+“拼接, 而这道题又见识到”+"的强大之处, 即可以往字符串的头部添加新的字符(串), 受益匪浅.