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
要注意的地方:
1.题意指的是相同数字并列排列格式为 数字 该数字连续的个数 √ 而非指的是一串数字中某个数字的总个数 数字 总个数×
例如d11231 1个d,2个1,1个2,1个3,1个1, 故下一项为d112213111
2.数组要开大 不然会出现段错误
首次通过代码:
1 #include<stdio.h> 2 int func(int *a,int a_len,int *b){//a为第n项,b为第n+1项 3 int b_len=0; 4 int num=0; 5 int c_num=a[0]; 6 for(int i=0;i<a_len;i++){ 7 if(c_num==a[i]) { 8 num++; 9 } 10 else{ 11 b[b_len++]=c_num; 12 b[b_len++]=num; 13 c_num=a[i]; 14 num=1; 15 } 16 if(i==a_len-1){ 17 b[b_len++]=c_num; 18 b[b_len++]=num; 19 } 20 } 21 return b_len; 22 } 23 int main(){ 24 int a[1000000]={0}; 25 int b[1000000]={0}; 26 int sum; 27 scanf("%d %d",&a[0],&sum); 28 int flag=1;int len=1; 29 for(int i=0;i<sum-1;i++){ 30 if(flag) { 31 flag=0; 32 len=func(a,len,b); 33 } 34 else{ 35 flag=1; 36 len=func(b,len,a); 37 } 38 } 39 if(flag) 40 for(int i=0;i<len;i++)printf("%d",a[i]); 41 else 42 for(int i=0;i<len;i++)printf("%d",b[i]); 43 return 0; 44 } 45 46 47
参考
原文:https://www.cnblogs.com/a982961222/p/12367752.html