题目:
Look-and-say sequence is a sequence of integers as the following:
D, D1, D111, D113, D11231, D112213111, ...
where
D
is in [0, 9] except 1. The (n+1)st number is a kind of description of the nth number. For example, the 2nd number means that there is oneD
in the 1st number, and hence it isD1
; the 2nd number consists of oneD
(corresponding toD1
) and one 1 (corresponding to 11), therefore the 3rd number isD111
; or since the 4th number isD113
, it consists of oneD
, two 1's, and one 3, so the next number must beD11231
. This definition works forD
= 1 as well. Now you are supposed to calculate the Nth number in a look-and-say sequence of a given digitD
.Input Specification:
Each input file contains one test case, which gives
D
(in [0, 9]) and a positive integer N (≤ 40), separated by a space.Output Specification:
Print in a line the Nth number in a look-and-say sequence of
D
.Sample Input:
1 8
Sample Output:
1123123111
题目大意:就是外观数列,乙级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 项。
解题思路:从当前所指字符串向后遍历,用cnt统计重复的数字,若下一个不重复则开始修改字符串,将cnt的值作为新的后缀。
代码:
#include<iostream>
using namespace std;
int main(){
string s;
int n,x;
cin>>s>>n;
for(int i=1;i<n;i++){
string temp;
for(int j=0;j<s.size();j++){
int cnt=1;
while(j+1<s.size()&&s[j+1]==s[j]){
cnt++;//计算重复的数;
j++;
}temp+=s[j]+to_string(cnt);
}s=temp;
}cout<<s;
}