题目
从X星截获一份电码,是一些数字,如下:
13
1113
3113
132113
1113122113
…
YY博士经彻夜研究,发现了规律:
第一行的数字随便是什么,以后每一行都是对上一行“读出来”
比如第2行,是对第1行的描述,意思是:1个1,1个3,所以是:1113
第3行,意思是:3个1,1个3,所以是:3113
请你编写一个程序,可以从初始数字开始,连续进行这样的变换。
输入
第一行输入一个数字组成的串,不超过100位
第二行,一个数字n,表示需要你连续变换多少次,n不超过20
输出一个串,表示最后一次变换完的结果。
输出
输出一个串,表示最后一次变换完的结果。
样例输入
5
7
样例输出
13211321322115
解题思路
本题有点类似于行程编码,对连续的数字先输出个数,再输出数字本身。因此,按照题目中所述的一次一次变换即可。
代码
#include<stdio.h>
#include<string.h>
char a[1000001],b[1000001];
int lenb;
void itoa(int a){
int k = 0,temp=a;
char c[1000001];
while (temp!=0){
c[k++] = temp%10+48;
temp/=10;
}
for (int i=k-1;i>=0;i--)
b[lenb++] = c[i];//存入个数
}
int main()
{
int i,j,n;//第二行,一个数字n,表示需要你连续变换多少次,n不超过20
int k,lena,temp;
scanf("%s\n%d",a,&n);
for (i=0;i<n;i++)//变换次数
{
lena = strlen(a);
lenb = 0;
for (j=0;j<lena;j++)//遍历当前char数组
{
if (j<(lena-1) && a[j]==a[j+1])
{
for (k=j;k<(lena-1);k++)
if (a[k]!=a[k+1])
break;
temp = k-j+1;//个数
itoa(temp);
b[lenb++] = a[j];
j = k;
}
else
{
b[lenb++] = '1';
b[lenb++] = a[j];
}
}
b[lenb++] = '\0';
strcpy(a,b);
}
printf("%s",a);
return 0;
}