您的位置:首页 > 其它

读数序列: 1,11,21,1211,111221,312211

2016-04-16 12:48 513 查看
说数序列从 1 开始,然后开始读:

1 读为: 11,提取数字11(即为第二个数);

11 读为: 21,提取数字21(即为第三个数);

21 读为: 1211,提取数字1211(即为第四个数);

1211 读为:1个1、1个2、2个1;提取数字111221(即为第四个数);

……

编程计算第n个读数序列中的数字串,用字符串表示:

编程思想:

用vector<int>存储数字串,最后将第n个求出来的数字串转化为字符串string。

从1开始,依次计算第2个、第3个、……第n个数字串。计算过程如下:

假设已计算至第n-1个数字串,记为vector<int> s1,遍历s1,统计连续出现的数字及出现次数,每统计一次,将统计结果插入数字串s2,

如111233,1连续出现3次,s2=31;

2出现1次,s2=3112;

3出现2次。s2=311223,统计结束,得到第n个数字串。

程序如下:

#include<iostream>

#include<vector>

#include<string>

using namespace std;

void print(vector<int> s){

auto it=s.begin();

while(it!=s.end()){

cout<<*it;

++it;

}

cout<<endl;

}

string vTs(vector<int> v){

string s;

auto it=v.begin();

while(it!=v.end()){

const char c=*it+'0';

s.push_back(c);

++it;

}

return s;

}

string countAndSay(int n) {

vector<int> s1={1},s2;

int i=0,j=0;

for(int k=0;k<n-1;k++){

auto it=s1.begin();

while(it!=s1.end()){

i=1;

j=*it;

++it;

while(it!=s1.end()&&*it==j){

i++;

++it;

}

s2.push_back(i);

s2.push_back(j);

}

s1=s2;

s2={};

}

return vTs(s1);

}

int main(){

cout<<countAndSay(6)<<endl;

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: