按照字符串输入之后,统计出现的个数,然后转化为数字,相加。
对于溢出的问题当时没有仔细考虑,题目中给出的最大的是[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.