外观数列是指具有以下特点的整数序列:
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 项。 输入样例:
1 8
输出样例:
1123123111
感觉PAT乙级的题目都是要运用STL的水题,感觉靠这些题目还让我熟练的掌握了STL的运用,这还挺好的 哈哈哈
感觉自己写的代码好蠢,但是这确实是正常的思路,我再来看看别人写的 应该比我优化。
#include<iostream>
#include<vector>
using namespace std;
int d,n;
vector<vector<int> > a(10005);
int main()
{
cin>>d>>n;
if(d==1)
{
a[1].push_back(1);
for(int i=2;i<=n;i++)
{
int cnt=1;
int t=0;
for(int j=0;j<a[i-1].size();j++)
{
if(t==0)a[i].push_back(1);
else if(a[i-1][t]==a[i-1][t-1])
{
cnt++;
}
else if(a[i-1][t]!=a[i-1][t-1])
{
a[i].push_back(cnt);
cnt=1;
a[i].push_back(a[i-1][t]);
}
t++;
}
a[i].push_back(cnt);
}
for(int i=0;i<a[n].size();i++)
{
cout<<a[n][i];
}
return 0;
}
a[2].push_back(1);
for(int i=3;i<=n;i++)
{
int cnt=1;
int t=0;
a[i].push_back(1);
for(int j=0;j<a[i-1].size();j++)
{
if(t==0)a[i].push_back(1);
else if(a[i-1][t]==a[i-1][t-1])
{
cnt++;
}
else if(a[i-1][t]!=a[i-1][t-1])
{
a[i].push_back(cnt);
cnt=1;
a[i].push_back(a[i-1][t]);
}
t++;
}
a[i].push_back(cnt);
}
cout<<d;
for(int i=0;i<a[n].size();i++)
{
cout<<a[n][i];
}
}
打扰了,原来这题是这样做的,这代码真的是短小精悍
#include<iostream>
using namespace std;
int main()
{
int n,j;
string s;
cin >> s >> n;
for (int cont = 1; cont < n; cont++)
{
string t;
for (int i = 0; i < s.length(); i = j)
{
for (j = i; j < s.length()&&s[j]==s[i]; j++);
t += s[i] + to_string(j - i);
}
s = t;
}
cout << s;
}