PAT 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

用字符串描述上一个字符串,即从左往右,每个数连续出现的次数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <string>

using namespace std;

string read(string source) {
string result;
int cnt = 1;
for (int i = 1; i < source.size(); i++) {
if (source[i] != source[i - 1]) {
result += to_string(source[i - 1] - '0') + to_string(cnt);
cnt = 0;
}
cnt++;
}
result += to_string(*source.rbegin() - '0') + to_string(cnt);
return result;
}

int main() {
int d = 0, n = 0;
scanf("%d %d", &d, &n);
string s = to_string(d);
for (int i = 1; i < n; i++)
s = read(s);
printf("%s", s.c_str());
return 0;
}