> 文章列表 > 洛谷P8706 [蓝桥杯 2020 省 AB1] 解码 C语言/C++

洛谷P8706 [蓝桥杯 2020 省 AB1] 解码 C语言/C++

洛谷P8706 [蓝桥杯 2020 省 AB1] 解码 C语言/C++

[蓝桥杯 2020 省 AB1] 解码

题目描述

小明有一串很长的英文字母,可能包含大写和小写。

在这串字母中,有很多连续的是重复的。小明想了一个办法将这串字母表达得更短:将连续的几个相同字母写成字母 + 出现次数的形式。 例如,连续的 555a,即 aaaaa,小明可以简写a5(也可能简写成 a4aaa3a 等)。

对于这个例子:HHHellllloo,小明可以简写成 H3el5o2。为了方便表达,小明不会将连续的超过9个相同的字符写成简写的形式。

现在给出简写后的字符串,请帮助小明还原成原来的串。

输入格式

输入一行包含一个字符串。

输出格式

输出一个字符串,表示还原后的串。

样例 #1

样例输入 #1

H3el5o2

样例输出 #1

HHHellllloo

提示

对于所有评测用例,字符串由大小写英文字母和数字组成,长度不超过 100100100。请注意原来的串长度可能超过 100100100

蓝桥杯 2020 第一轮省赛 A 组 F 题(B 组 G 题)。

所需变量

char str[105];//用于存储输入进来的字符串

char sum[1005];//用于存储解码后的数据

char temp;//用于一个字符一个字符接收字符串

int i,j;//循环变量

int control;//用于控制最后主串的长度

int sumi;//用于记录本次字符串的个数

int sump;//代表输入进来字符串的总长度

思路:我们首先将加密后的字符串输入进来,然后逐个判断是否是字母或者是数字,如果是数字就代表它前面的字母出现多少次我们就把他解码,也就是输出多少个这个字母就算完成!
首先我们要将所有的字符都读入进来,代码如下:

while(~scanf("%c",&temp)){if(temp == '\\n'){break;}str[sump++] = temp;
}

读入后我们需要判断如果是字母那么我们就将其加入到最后解码总和中去,如果是数字也就代表他前面那个数需要出现该数字次数,我的做法如下:

for(i = 0;i<sump;i++){if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')){temp = str[i];sum[control++] = temp;}else{sumi = str[i] - 48;for(j = 1;j<sumi;j++){sum[control++] = temp;}}
}

最后将其输出出来,完整代码如下(编译器是dev,语言是C语言):

#include<iostream>
using namespace std;
#include<string.h>
int main(){char str[105];char sum[1005];char temp;int i = 0,j,control = 0,sumi,sump = 0;while(~scanf("%c",&temp)){if(temp == '\\n'){break;}str[sump++] = temp;}for(i = 0;i<sump;i++){if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')){temp = str[i];sum[control++] = temp;}else{sumi = str[i] - 48;for(j = 1;j<sumi;j++){sum[control++] = temp;}}}for(i = 0;i<control;i++){cout<<sum[i];}cout<<endl;return 0;
}

洛谷P8706 [蓝桥杯 2020 省 AB1] 解码 C语言/C++