计蒜客-计数和数数

2019-01-15  本文已影响0人  坠木

链接如下:

计数和数数 - 题库 - 计蒜客

“伯爵说”序列如下:1,11,21,1211,111221,…1,11,21,1211,111221, \ldots1,11,21,1211,111221,…。其1读作one 1或者11。11读作two 1s或者21。21读作one 2, one 1或者1211。

输入格式

多组输入,读到文件结束。每组输入给定一个整数n(1≤n≤30)n(1 \leq n \leq 30)n(1≤n≤30)。

输出格式

输出第nnn个序列。注意,整数序列以字符串的形式表示。


这题类似于斐波那契数列的求解,我这里直接求了从第一项到第三十项的结果,避免重复计算.

同时利用了#include<sstream>这个头文件下的函数,进行int到string的转换.挺好用的.


#include<stdio.h>

#include<string>

#include<iostream>

#include<sstream>

using namespace std;

string change(string s);

string num(int n);

int main()

{

    int n;

    string str[31];

    str[1]="1";

    for(int i=2;i<31;i++)

        str[i]=change(str[i-1]);  //求1~30项的结果并存起来,每一项都要利用到上一项.函数作用看下面.

    while(~scanf("%d",&n))

        cout<<str[n]<<endl;

    return 0;

}

string change(string s)

{

    int count=1;

    string s2;

    for(int i=1;i<s.size();i++){

        if(s[i]==s[i-1]) count++;   //count 用来记录相通项的数量.

        else{

            s2+=num(count)+s[i-1];   //num();函数用来将相同项数量转换为string,以便后续的加和得到新的string.

            count=1;

        }

    }

    s2+=num(count)+s[s.size()-1];

    return s2;

}

string num(int n)  

{

    string s;

    stringstream x;  // 这里用到刚才说到的#include<sstream>头文件下的函数,具体机理不了解,你可以百度.

    x<<n;

    x>>s;

    return s;

}

上一篇下一篇

猜你喜欢

热点阅读