1.两个非负大数相加:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int L=110;
string add(string a,string b)//只限两个非负整数相加
{
    string ans;
    int na[L]={0},nb[L]={0};
    int la=a.size();
    int lb=b.size();
    // 倒叙存储
    for(int i=0;i<la;i++)
        na[la-1-i]=a[i]-'0';
    // 倒叙存储
    for(int i=0;i<lb;i++)
        nb[lb-1-i]=b[i]-'0';
    int lmax=la>lb?la:lb;
    // 从个位开始计算
    for(int i=0;i<lmax;i++)
    {
        na[i]+=nb[i];
        na[i+1]+=na[i]/10;
        na[i]%=10;
    }
    // 去除前置0
    if(!na[lmax])
        lmax--;
    for(int i=lmax;i>=0;i--)
        ans+=na[i]+'0';
    return ans;
}
int main()
{
    string a,b;
    while(cin>>a>>b)
        cout<<add(a,b)<<endl;
    return 0;
}


2.一正一负相加:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <iostream>
#include <cstring>

using namespace std;

const int maxn = 10010;

char a[maxn],b[maxn];
int aa[maxn],bb[maxn];


void add(char str1[],char str2[])
{
    memset(aa,0, sizeof(aa));
    memset(bb,0, sizeof(bb));
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    int flag1 = 0,flag2 = 0;
    // 都是0的时候特殊处理
    if (str1[0] == '0' && str2[0] == '0')
        printf("0\n");
    else
    {
        // str1是负数
        if (str1[0] == '-')
        {
            flag1 = 1;
            for (int i=0;i<len1-1;i++)
            {
                aa[i] = str1[len1-1-i] - '0'; //倒叙记录
            }
        }
        else
        {
            // str1是正数
            for (int i=0;i<len1;i++)
            {
                aa[i] = str1[len1-1-i] -'0';
            }
        }

        //str2是负数
        if (str2[0] == '-')
        {
            flag2 = 1;
            for (int i=0;i<len2-1;i++)
            {
                bb[i] = str2[len2-1-i] - '0';
            }
        }
        else
        {
            // str2是正数
            for (int i=0;i<len2;i++)
            {
                bb[i] = str2[len2-1-i]- '0';
            }
        }

    //分四种情况对str1,str2处理

    if (!flag1 && !flag2) //str1 和 str2都是正数
    {
        int len = max(len1,len2);
        for (int i=0;i<len;i++)
        {
            bb[i] += aa[i];
            bb[i+1] += bb[i]/10;
            bb[i]%=10;
        }
        //处理前置零
        while (!bb[len])
            len--;
        for (;len>=0;len--)
            printf("%d",bb[len]);
        printf("\n");
    }
    else if (!flag1 && flag2) // str1是正数,str2是负数
    {
        int ans = 0;
        //判断str1和str2的绝对值谁大谁小
        if (len1>len2-1)
            ans = 1;
        else if (len1 == len2-1)
        {
            for (int i=len1-1;i>=0;i--)
            {
                if (aa[i]>bb[i])
                {
                    ans = 1;
                    break;
                }
                else if (aa[i]<bb[i])
                {
                    ans = 0;
                    break;
                }
            }
        }
        // 如果str1的绝对值更大
        if (ans)
        {
            for (int i=0;i<len1;i++)
            {
                aa[i] -= bb[i];
                while (aa[i]<0)
                {
                    aa[i] += 10;
                    aa[i+1]--;
                }
            }
            //处理前置零
            while (!aa[len1])
                len1--;
            for (;len1>=0;len1--)
                printf("%d",aa[len1]);
            printf("\n");
        }
        else  // 如果str2的绝对值更大
        {
            for (int i=0;i<len2-1;i++)
            {
                bb[i] -= aa[i];
                while (bb[i]<0)
                {
                    bb[i]+=10;
                    bb[i+1]--;
                }
            }
            //处理前置零
            while (!bb[len2])
                len2--;
            if (len2<0)    // 注意333  -333 的情况
                printf("0\n");
            else
            {
                for (;len2>=0;len2--)
                    printf("%d",bb[len2]);
                printf("\n");
            }
        }
    }
    else if (flag1 && !flag2) //str1为负数 str2为正数
    {
        int ans = 0;
        // 判断str1 和 str2 的绝对值的大小
        if (len2>len1-1)
        {
            ans = 1;
        }
        else if (len2 == len1-1)
        {
            for (int i = len2 - 1; i >= 0; i--)
            {
                if (aa[i] > bb[i])
                {
                    ans = 0;
                    break;
                }
                else if (bb[i] > aa[i])
                {
                    ans = 1;
                    break;
                }
            }
        }
        //判断结果的正负
        if (ans)
        {
            for (int i=0;i<len2;i++)
            {
                bb[i] -= aa[i];
                while (bb[i]<0)
                {
                    bb[i]+=10;
                    bb[i+1]--;
                }
            }
            //处理前置0
            while (!bb[len2])
                len2--;
            for (;len2>=0;len2--)
                printf("%d",bb[len2]);
            printf("\n");
        }
        else
        {
            for (int i=0;i<len1-1;i++)
            {
                aa[i] -= bb[i];
                while (aa[i]<0)
                {
                    aa[i]+=10;
                    aa[i+1]--;
                }
            }
            //处理前置0
            while (!aa[len1])
                len1--;
            if (len1<0)        // 注意333 -333 的情况
                printf("0\n");
            else
            {
                printf("-");
                for (;len1>=0;len1--)
                {
                    printf("%d",aa[len1]);
                }
                printf("\n");
            }
        }
    }
    else if (flag1 && flag2) // 都是负数
    {
        printf("-");
        int len = max(len1,len2);
        for (int i=0;i<len-1;i++)
        {
            bb[i] += aa[i];
            bb[i+1] += bb[i]/10;
            bb[i]%=10;
        }
        while (!bb[len])
            len--;
        for (;len>=0;len--)
            printf("%d",bb[len]);
        printf("\n");
    }
    }
}





int main()
{
    while (cin >> a >> b)
    {
        add(a,b);
    }
    return 0;
}