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
解释都在代码注释了.
网上太多的PAT代码别说注释了 , 连个题意都讲不清楚
show me the codes
#include <bits/stdc++.h>
using namespace std;
// 题目非常拗口, 意思简单其实是:
// 根据以下规则生成序列:
// 第一项S_1是D,其中D为[0-9]任意数字
// 递推规则为:
// S_n+1 为: S_n 中连续数字的描述的拼接,
// 其中描述为 : 数字&数字连续出现次数
int main() {
int n;
string s;
cin >> s >> n;
for (int k = 1; k < n; k++) {
string t;
int top = 1;
// t 为这次迭代的序列
// top是某个字符出现的次数,默认1因为至少出现一次
// 遇见新字符时,输出字符和字符数,并将top重置
for (int j = 1; j < s.size() + 1; j++) {
if (s[j] == s[j - 1]) {
top++;
}
else {
t += s[j - 1] + to_string(top);
top = 1;
}
}
s = t;
}
cout << s;
return 0;
}