外观数列是指具有以下特点的整数序列:
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
思路:还是模拟,模拟就完事了,这题类似与 1078 字符串压缩与解压......
1 #include<iostream>
2 #include<cstring>
3 #include<algorithm>
4 using namespace std;
5 int main()
6 {
7 int num,N;
8 cin>>num>>N;
9 int sum[100005];
10 int sum1[100005];
11 sum[0]=num;//第一步
12 sum1[0]=sum[0];
13 sum[1]=1;//第二步
14 sum1[1]=sum[1];
15 if(N<=2)
16 {
17 for(int i=0;i<N;i++)
18 cout<<sum[i];
19 return 0;
20 }
21 int count=2;
22 for(int i=2;i<N;i++)
23 {
24 int ans=1;
25 int t=count;//代替count
26 count=0;//刷新count存数
27 for(int j=0;j<t;j++)
28 {
29 int temp=sum1[j];
30 //cout<<"temp:"<<temp<<endl;
31 if(sum1[j]==sum1[j+1])
32 {
33 ans++;
34 }
35 else
36 {
37 sum[count++]=temp;//存数
38 sum[count++]=ans;//存数量
39 ans=1;//刷新ans
40 }
41 }
42 for(int i=0;i<count;i++)
43 sum1[i]=sum[i];
44 }
45 for(int i=0;i<count;i++)
46 cout<<sum[i];
47 return 0;
48 }