这题有两个坑:
第一:字符串部分的数字可能多于20位,不可使用整型甚至是long long 以及 atoi() 等字符转换函数;
只可以对字符串进行模拟加法;
第二:要留意前导零不可省略;只看字符是数字部分!!!!
剩下的看代码内的注释。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
char s[N];
int main() {
int T;
scanf("%d", &T);
getchar();
while (T--) {
gets(s);
int len = strlen(s);
int last = -1, first = 0;
//last 指的是最后那部分数字串的最后一位的位置;同理first是指在那部分数字串的第一位的位置。
//下面从字符串尾部开始遍历找出那个last的位置。
for (int i = len - 1; i >= 0; --i) {
if (isdigit(s[i])) {
last = i;
break;
}
}
//情况一:该字符串全是非数字的,则直接输出一条完整的字符串。
if (last == -1) {
printf("%s\n", s);
continue;
}
//情况二:有数字部分,遍历找出first,last;
for (int i = last - 1; i >= 0; --i) {
if (!isdigit(s[i])) {
first = i + 1;
break;
}
}
int cnt = last - first + 1;//cnt指的是那部分数字的总长度。
int add = 0; //下文部分的 add 指的是加法中是否向下一位进一 例如 9+2 →add=1;
for (int i = last; i >= first; --i) {
int tmp;
if (i == last) tmp = s[i] - '0' + 1 + add;//例如 s[i]='9', 则 s[i]-'0'='9'-'0'=9;按题意最后一位数字加1;
else tmp = s[i] - '0' + add;
add = tmp / 10;
tmp = tmp % 10;
s[i] = tmp + '0';//将 最后tmp的结果转为字符存进 s[i];
}
//先输出数字部分前面的全部字符串;
for (int i = 0; i < first; ++i) {
printf("%c", s[i]);
}
if (add) printf("1");
for (int i = first; i < len; ++i) {
printf("%c", s[i]);
}
puts("");
}
return 0;
}