1084 外观数列 (20分)
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
代码讲解:此题我还是用纯c解的,这题要小心,他最后的数据非常长,用数组很容易超界,最后我直接开到了
最大。。。
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char a[1000000]={0},b[1000000],num[200];//数组一定要开大 6 int start,n,str,i,j,count,num_count; 7 scanf("%d %d",&start,&n); 8 a[0]=start+'0';a[1]='\0'; 9 while(--n) 10 { 11 str=strlen(a); 12 count=1; 13 b[0]=a[0]; //b数组相当于收集a数组不重复元素的那些 14 for(i=1,j=0;i<=str;i++) //注意是小于等于,因为这样能帮助最后一个元素也不落下。 15 { 16 if(b[j]==a[i]) 17 { 18 count++; 19 } 20 else 21 { 22 b[++j]=count+'0'; 23 num_count=0; 24 while(count!='\0') 25 { 26 num[num_count++]=count%10; 27 count/=10; 28 } 29 while(--num_count) b[++j]=num[num_count]; 30 b[++j]=a[i]; 31 count=1; 32 } 33 } 34 strcpy(a,b); 35 } 36 printf("%s\n",a); 37 return 0; 38 }