杭电acm1002,该怎么解决

杭电acm1002
杭州电子科技大的1002题 没思路 谁能讲一下思路啊

------解决方案--------------------
直接贴题目呗 让人上哪儿找去
------解决方案--------------------
第一个2 是你输入执行的次数,也就是说可以计算两次加法
这道题的关键在于处理数据溢出.因为第二个例子的数很大,要处理大整数相加
------解决方案--------------------
大数相加嘛,用字符串来处理呗,两个字符串的元素按位相加,注意进位就好了
------解决方案--------------------
直接读入两个字符串,然后从后面到前面想加,进位,然后输出。

或者直接java bigInteger
------解决方案--------------------
C/C++ code


#include "stdio.h"
#include "string.h"
#include "malloc.h"

int main()
{
    char** res = 0;

    char s0[1024];
    char s1[1024];

    size_t len0 = 0;
    size_t len1 = 0;

    char* p0 = 0;
    char* p1 = 0;
    char* c0 = 0;
    char* c1 = 0;

    int cnt = 0;
    int cy = 0;
    int i = 0;

    if (scanf("%d", &cnt) != 1 || cnt <= 0 || cnt > 20)
        return 1;

    res = (char**)malloc(sizeof(char*) * cnt);

    for (i = 0; i < cnt; ++i)
    {
        if (scanf("%s%s", s0, s1) != 2)
        {
            res[i] = 0;
            continue;
        }

        len0 = strlen(s0);
        len1 = strlen(s1);

        if (len0 <= len1)
        {
            p0 = s0;
            p1 = s1;
            c0 = s0 + len0 - 1;
            c1 = s1 + len1 - 1;
        }
        else
        {
            p0 = s1;
            p1 = s0;
            c0 = s1 + len1 - 1;
            c1 = s0 + len0 - 1;
        }

        res[i] = (char*)malloc((size_t)(c1 - p1) + len0 + len1 + 16);
        sprintf(res[i], "%s + %s = ", s0, s1);

        cy = 0;

        while (c0 >= p0)
        {
            cy = (*c0 - '0') + (*c1 - '0') + cy;

            if (cy >= 10)
            {
                (*c1) = (cy - 10) + '0';
                cy = 1;
            }
            else
            {
                (*c1) = cy + '0';
                cy = 0;
            }

            --c0;
            --c1;
        }

        while (c1 >= p1)
        {
            cy = (*c1 - '0') + cy;

            if (cy >= 10)
            {
                (*c1) = (cy - 10) + '0';
                cy = 1;
            }
            else
            {
                (*c1) = cy + '0';
                cy = 0;
                break;
            }
        }

        sprintf(res[i] + len0 + len1 + 6, "%s%s", cy > 0 ? "1" : "", p1);
    }

    for (i = 0; i < cnt; ++i)
      printf("Case %d:\n%s\n%s", i + 1, res[i] ? res[i] : "", i < cnt - 1 ? "\n" : "");

    for (i = 0; i < cnt; ++i)
        if (res[i])
            free(res[i]);
    free(res);

    return 0;
}

------解决方案--------------------
C/C++ code
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

vector<int> Add(vector<int> v1, vector<int> v2)
{
    reverse(v1.begin(), v1.end());
    reverse(v2.begin(), v2.end());
    int maxsize = v1.size() > v2.size() ? v1.size() : v2.size();
    vector<int> v3(maxsize);
    int m = 0;
    for(int i = 0; i < maxsize; ++i)
    {
        int t = m;
        if (i < v1.size()) t = t + v1[i];
        if (i < v2.size()) t = t + v2[i];
        m = t / 10;
        v3[i] = t % 10;
    }
    if (m > 0) v3.push_back(m);
    reverse(v3.begin(),v3.end());
    return v3;
}

int main()
{
    int n;
    string s1, s2;
    cin >> s1 >> s2;
    vector<int> v1(s1.size()), v2(s2.size());
    for (int i = 0; i < s1.size(); ++i)
    {
        v1[i] = s1[i] - '0';
    }
    for(int i = 0; i < s2.size(); ++i)
    {
        v2[i] = s2[i] - '0';
    }
    vector<int> v3 = Add(v1,v2);
    for(int i = 0; i < v3.size(); ++i)
    {
        cout << v3[i];
    }
    cout << endl;    while(1);
    return 0;

}