外观数列是指具有以下特点的整数序列:
d, d1, d111, d113, d11231, d112213111, ...
它从不等于 1 的数字 d
开始,序列的第 n+1 项是对第 n 项的描述。比如第 2 项表示第 1 项有 1 个 d
,所以就是 d1
;第 2 项是 1 个 d
(对应 d1
)和 1 个 1(对应 11),所以第 3 项就是 d111
。又比如第 4 项是 d113
,其描述就是 1 个 d
,2 个 1,1 个 3,所以下一项就是 d11231
。当然这个定义对 d
= 1 也成立。本题要求你推算任意给定数字 d
的外观数列的第 N 项。
输入格式:
输入第一行给出 [0,9] 范围内的一个整数 d
、以及一个正整数 N(≤ 40),用空格分隔。
输出格式:
在一行中给出数字 d
的外观数列的第 N 项。
输入样例:
1 8
输出样例:
1123123111
思路分析:用递归法较容易实现;递归函数:先定位一个字符,然后统计有多少个连续相同的,再附给新的字符串即可;
#include <iostream>
#include <stdio.h>
#include <string.h>
const int N=100000;//定义得大一些,不然最后一个测试点通不过
int solve(char *s,int m);
int main( )
{
char str[N]="";
int i,n,m;
scanf("%d%d",&n,&m);
str[0]=n+'0';//输入第一行给出 [0,9] 范围内的一个整数
solve(str,m);
return 0;
}
int solve(char *s,int m)
{
if(m==1)//结束递归
{
printf("%s\n",s);
return 0;
}
char str[N]="";
int i,j,k=0,len;
len=strlen(s);//字符串长度
for(i=0;i<len;i=i+j)
{
for(j=0;s[i]==s[i+j];j++);
str[k++]=s[i];//新的字符串存储在str
str[k++]=j+'0';//连续相同字符个数
}
solve(str,m-1);//用新的字符串继续,递归
return 0;
}