C程序-PAT-1084 外观数列

外观数列是指具有以下特点的整数序列:

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;
}

猜你喜欢

转载自blog.csdn.net/qq_40788199/article/details/89249013