外观数列是指具有以下特点的整数序列:
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 项。
思路:用vector来存储序列,从第2个序列开始,对前一个序列进行描述。
#include <iostream> #include <vector> using namespace std; int main() { int d,n; vector<int> v[40]; cin >>d>>n; v[0].push_back(d); //先把第一个序列的数放入数组里 for(int i=1;i<n;i++){ int cnt=1; //计算出现次数 v[i].push_back(v[i-1][0]);//把上个序列的第一个元素放入这个序列中 for(int j=1;j<v[i-1].size();j++){ if(v[i-1][j]==v[i-1][j-1]) cnt++; else{ v[i].push_back(cnt); //将次数放入数组 v[i].push_back(v[i-1][j]); //将下一个要计算的数放入数组 cnt=1; } } v[i].push_back(cnt); //将最后计算的那个数的出现次数放入数组 } for(int i=0;i<v[n-1].size();i++) cout <<v[n-1][i]; return 0; }