1140 Look-and-say Sequence (20分)

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 one ​​D​​​ in the 1st number, and hence it is ​​D1​​​; the 2nd number consists of one ​​D​​​ (corresponding to ​​D1​​​) and one 1 (corresponding to 11), therefore the 3rd number is ​​D111​​​; or since the 4th number is ​​D113​​​, it consists of one ​​D​​​, two 1's, and one 3, so the next number must be ​​D11231​​​. This definition works for ​​D​​​ = 1 as well. Now you are supposed to calculate the Nth number in a look-and-say sequence of a given digit ​​D​​.

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

又是一道晦涩难懂的题。

题意:给两个数字D和n,第一个序列是D,后一个序列描述前一个序列的所有数字以及这个数字出现的次数,比如D出现了1次,那么第二个序列就是D1,对于第二个序列D1,第三个序列这样描述:D出现1次,1出现1次,所以是D111……以此类推,输出第n个序列~ (来自柳​​婼​​)

第n+1个串是第n个串的描述,比如第n个串是 11123131112 则 第n+1个串就是 13213111311321

#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
int n, len;
cin >> s >> n;

for(int k = 1; k < n; k++){
len = s.length();
string temp = "";
int cnt = 0;
char pre = s[0];
// cout << "len: " << len << " ---> " << pre << endl;
for(int i = 0; i < len; i++){
if(s[i] == pre) cnt++;
else {
temp += pre;
temp += cnt + '0';
pre = s[i];
cnt = 1;
}
}
if(cnt >= 1){
temp += pre;
temp += cnt + '0';
}
s = temp;
}
cout << s << endl;
return 0;
}