读书人

杭电acm1002,该怎么解决

发布时间: 2012-04-03 12:38:19 作者: rapoo

杭电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;} 


[解决办法]
居然ACM也能到这里讨论

读书人网 >C++

热点推荐