具体思想其实就是模拟,加法就是按位相加,再考虑一下低位过来的进位就可以了。说起来简单但是实现起来就不是那么回事了。之前刚开始了解的是用数组存,好像还很麻烦,这些天突然看到一个用了string类型以及string类型有关的函数来解决这个问题的,感觉不错。先上代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,a,b;
    a=b=0;
    cin>>n;
    while(n--)
    {
        string s1,s2,s(10000,'0');
        cin>>s1>>s2;
        cout<<(b++?"\n":"");
        reverse(s1.begin(),s1.end());
        reverse(s2.begin(),s2.end());
        for(int i=0;i<s1.size();i++)
        {
            s[i]=s1[i];
        }
        int temp=0;
        for(int i=0;i<s2.size();i++)
        {
            temp+=s[i]+s2[i]-'0'-'0';
            s[i]=temp%10+'0';
            temp/=10;
        }
        s[s2.size()]=s[s2.size()]+temp;
        reverse(s.begin(),s.end());
        reverse(s1.begin(),s1.end());
        reverse(s2.begin(),s2.end());
        cout<<"Case "<<b<<':'<<endl;
        cout<<s1<<" + "<<s2<<" = "<<s.substr(s.find_first_not_of('0'))<<endl;
    }
    return 0;
}

这是HDU1002的AC代码。其中有很多是格式控制符,跟大数相加无关,所需要理解的其实就是这一步

       for(int i=0;i<s2.size();i++)
        {
            temp+=s[i]+s2[i]-'0'-'0';
            s[i]=temp%10+'0';
            temp/=10;
        }

temp所表示的数就是进位。
另外这里面还用到s.substr(),s.find_first_not_of()函数。因为在定义结果字符串s的时候定义成了全是0的一个字符串。s.substr()用来输出子串,s.find_first_not_of()用来找到第一个不是0的字符的位置来生成子串。
这样写还是很简洁的,也比较好理解。