题目:
从X星截获一份电码,是一些数字,如下:
13
1113
3113
132113
1113122113
....
YY博士经彻夜研究,发现了规律:
第一行的数字随便是什么,以后每一行都是对上一行“读出来”
比如第2行,是对第1行的描述,意思是:1个1,1个3,所以是:1113
第3行,意思是:3个1,1个3,所以是:3113
请你编写一个程序,可以从初始数字开始,连续进行这样的变换。
输入:
第一行输入一个数字组成的串,不超过100位
第二行,一个数字n,表示需要你连续变换多少次,n不超过20
输出一个串,表示最后一次变换完的结果。
输出:
输出一个串,表示最后一次变换完的结果。
➢ eg:
这个算法的关键就是,每一行的数字都是一个字符,个体是作为字符存在的,☛代码如下:
#include<iostream>
#include<string.h>
#include<string>
using namespace std;
int main() {
char code[10000];
// memset是初始化函数,作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。
// sizeof() 是一个判断数据类型或者表达式长度的运算符
memset(code, '\0', sizeof(code)); //初始化
char codetmp[10000];
memset(codetmp, '\0', sizeof(codetmp)); //初始化
int index = 0;
int n;
cin >> code;
int len = strlen(code);
cin >> n;
char start;
int num = 0;
while (n--) { // 这个while循环针对code数组
bool flag = 0;
start = code[0]; // 标记当前连续的那个字符
index = 0;
num = 0;
len = strlen(code);
for (int i = 0; i<len; i++) {
if (code[i]==start) // 如果 当前字符==当前连续字符
num++;
if (i == len-1) // 如果已经是最后一个字符了
flag = 1;
if (code[i]!=start) {
// 先把个数num和字符start存起来
codetmp[index++] = num + '0'; // codetmp是字符数组,所以要加上'0'
codetmp[index++] = start;
//再把当前连续字符换成code[i]
start = code[i];
num = 1;
}
}
// 如果已经是最后一个字符,因为我们还没有存num和start,得操作如下
if (flag) {
codetmp[index++] = num + '0';
codetmp[index++] = start;
}
// 因为要保证while循环针对code数组,这里把codetmp数组复制到code数组
int t_len = strlen(codetmp);
for (int i = 0; i<t_len; i++)
code[i] = codetmp[i];
}
cout << code << endl;
system("pause");
}