#820 B Decode String

发布时间 2023-05-19 21:06:27作者: harper886

昨天在cf上面做的一个字符串处理的题目
debug了很久终于做出来了,很开心
题目点我

下面就是代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
	char arr[99];//第一个字符数组用来存储数字字符串
	char brr[99];//第二个数组用来存储得到的字符串
	//我这里采用的是多组输入
	int a;
	int n;
	int b;
	int c;
	scanf("%d", &n);//读取有多少个测试数据
	int count = 0;//定义一个计数器
	for (int i = 0; i < n; i++) {//循环读入数据
		count = 0;//给计数器初始化
		scanf("%d", &a);//每一组数据的长度
		getchar();//读入空格并丢掉
		gets(arr);//读入整个的字符串

		for (int i = a - 1; i >= 0;) {//倒着识别有利于字符的判断

			if (arr[i] >= '1'  && arr[i] <= '9') {
				brr[count] = arr[i] + 48;
				count++;
				i--;
				/*
				当读入的是数字1-9的时候直接转化为a-i
				他们的ascll码差48,所以加上48;
				同时让count++,记录数组长度
				然后让i--,为什么i--不写在前面的循环头部
				那是因为后面需要让i直接减3
				*/
			} else if (arr[i] == '0') {
				b = (int)arr[i - 1] - 48;
				c = (int)arr[i - 2] - 48;
				
				/*
				这里当字符为0的时候
				必须要向前读入3个字符
				b用来储存0前面的那个字符
				c用来储存0前面再向前一位的字符
				我们把储存的数字字符减去48
				这样他们就真的变成了对应的数字
				不要忘记强制类型转换
				因为后面我们要对他们做加减乘除运算
				*/
				
//				printf("%d",(c * 10 + b)+96);
//				printf("%c",(c * 10 + b)+96);



				brr[count] = (c * 10 + b) + 96;
				//对数字加上96再转为字符行就完美的转换为了小写英文字母
				count++;
				i = i - 3;
				/*
				这样填入你会发现我们会把英文倒着填入brr字符数组
				后面必须倒着遍历
				*/
			}


		}
		for (int i = count - 1; i >= 0; i--) {
			printf("%c", brr[i]);
		}
		//遍历整个数组,并且换行
		//注意这里的count要减一,因为count最后多加了一个1
		printf("\n");

	}





	return 0;
}