2260-与班尼特·胡迪一起成长

这题有两个坑:
第一:字符串部分的数字可能多于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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值