一【题目难度】
- 乙级
二【题目编号】
- 1084 外观数列 (20 分)
三【题目描述】
- 外观数列是指具有以下特点的整数序列:
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
五【解题思路】
- 这个题目有难度,主要是题意不好理解,我想了好久才明白,我下面先解释一下题意:
①:第一项为d
②:第二项是对第一项的描述,形式为:因为第一项有一个d,所以第二项为d1(前面是某个数字,后面是这个数字出现的次数)
③:第三项是对第二项的描述,形式为:因为第二项有一个d,一个1,所以第三项为d1 11
④:第四项是对第三项的描述,形式为:因为第三项有一个d,三个1,所以第四项为d1 13
⑤:…… - 理解好题目就可以写代码了,我们生命两个数组,不停的迭代,首先a数组第一项肯定是输入的数字,注意要用字符类型接收,然后迭代n-1次之后就是第n个数组,首先对比a和b数组,以b数组为主,比较有相同的元素记录出现次数,然后更新b数组的值,一次循环之后b数组已经是某一次的最终结果,然后记录当前数组长度,并且将b数组拷贝到a数组,继续迭代,最终输出即可
六【最终得分】
- 20分
七【代码实现】
#include<stdio.h>
#include<string.h>
int main()
{
char a[100000],b[100000];
int len = 1,count,index,n,i,j;
scanf("%c %d",&a[0],&n);
for(i = 1;i<n;i++)
{
for(j = 0,count = 0,index = 0,b[0] = a[0];j<=len;j++)
{
if(a[j] == b[index])
{
count++;
}
else
{
b[++index] = count + '0';
b[++index] = a[j];
count = 1;
}
}
len = index;
strcpy(a,b);
}
printf("%s",a);
return 0;
}