首先是自己的写法,在模拟的过程中不要简单的只判断下一位是否进位,然后当前位是否也进位,还需要判断下一位进位的这个1加上我当前计算的a[i] + b[i] 是否进位,这样才能避免连续进位的情况
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
int main()
{
int i;
string a,b;
int re[N] = {0};
cin >> a >> b;
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());//翻转数组使得从低位到高位一一对应
if(a.size() >= b.size()) swap(a,b);//先从比较短的一个string数组着手
int cf = 0;/*定义一个进位标识,本来是想使用bool类型的,但int类型的既可以当做下一位进
位上来的1,又可以当做是否当前进位是否进位的标识。 */
for(i=0; i<a.size();i++)
{
if(cf == 1) re[i] = (a[i] + b[i] - 2 * '0' + 1)%10;//首先判断下一位是否有进位
else re[i] = (a[i] + b[i] - 2 * '0')%10;
if((a[i]-'0'+ b[i] - '0' + cf) >= 10)//判断当前为是否进位
cf = 1;
else
cf = 0;
}
while(i<b.size()) /*这里不能简单的把b后面没有进行加减的数全部拿过来,因为此时可能有
连续进位*/
{
if(cf == 1) re[i] = (b[i] - '0' + 1)%10;//相当于b在和0做加减,同上
else re[i] = (b[i] - '0')%10;
if((re[i] + b[i] - '0' + cf) >= 10)
cf = 1;
else
cf = 0;
i++;
}
if(cf == 1) re[i++] = 1;/*到了次高位的位置,如果此时cf == 1 说明次高位有进位,
那么最高位应该是次高位所进的1*/
for(int j = i-1;j>=0;j--)
{
cout<<re[j]; //朴实无华的逆序输出
}
}
然后是y总的写法
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
int re[N];
int main()
{
int i;
string a,b;
cin >> a >> b;
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());//翻转数组使得从低位到高位一一对应
if(a.size() < b.size()) swap(a,b);//先从比较长的一个string数组着手
int cf = 0;
for(i = 0;i<a.size();i++)
{
if(i<a.size()) cf = cf + a[i] - '0';
if(i<b.size()) cf = cf + b[i] - '0';
re[i] = cf%10;
cf /=10;
}
if(cf) re[i++] = cf%10;
for(int j=i-1;j>=0;j--) cout << re[j];
}
相对于我的做法,这里直接将进位,标志,a[i]+b[i]的值都放在了进位标志中,这样可以少写判断情况
第二个值得借鉴的是直接在最长的字符串中进行运算,在循环体里面判断是否超过了较小的字符串的长度就可以了
十分的精妙(代码总体量也很少!)