【PAT B 1016】部分A+B

按照字符串输入之后,统计出现的个数,然后转化为数字,相加。
对于溢出的问题当时没有仔细考虑,题目中给出的最大的是[10^10] ,而int是[10^9]。虽然题意说的是部分和并且也能AC,但是当测试样例到达右边界时,会出现溢出,所以还是long long 保险一点。溢出分为两种,两正数相加为负数,两负数相加为正数。可以用这个原理来判断超出位数的比较运算。

#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 105;
int number(char c,int times){
    int sum = 0;
    int number = c - '0';
    while(times--){
        sum *= 10;
        sum += number;
    }
    return sum;
}
int main() {
    char listA[maxn], listB[maxn];
    char DA, DB;
    int lenA, lenB, sum = 0, timeA = 0, timeB = 0;
    cin >> listA >> DA >> listB >> DB;
    lenA = strlen(listA);
    lenB = strlen(listB);
    for (int i = 0; i < lenA; i++) {
        if (listA[i] == DA)
            timeA++;
    }
    for (int i = 0; i < lenB; i++) {
        if (listB[i] == DB)
            timeB++;
    }
    sum = number(DA,timeA) + number(DB,timeB);
    cout << sum;

    return 0;
}
9999999999 9 9999999999 9
-1474836482
Process returned 0 (0x0)   execution time : 23.772 s
Press any key to continue.
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 105;
long long number(char c,int times){
    long long sum = 0;
    int number = c - '0';
    while(times--){
        sum *= 10;
        sum += number;
    }
    return sum;
}
int main() {
    char listA[maxn], listB[maxn];
    char DA, DB;
    int lenA, lenB, timeA = 0, timeB = 0;
    long long sum = 0;
    cin >> listA >> DA >> listB >> DB;
    lenA = strlen(listA);
    lenB = strlen(listB);
    for (int i = 0; i < lenA; i++) {
        if (listA[i] == DA)
            timeA++;
    }
    for (int i = 0; i < lenB; i++) {
        if (listB[i] == DB)
            timeB++;
    }
    sum = number(DA,timeA) + number(DB,timeB);
    cout << sum;

    return 0;
}

简直完美。

9999999999 9 9999999999 9
19999999998
Process returned 0 (0x0)   execution time : 8.980 s
Press any key to continue.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容