美文网首页
计蒜客-计数和数数

计蒜客-计数和数数

作者: 坠木 | 来源:发表于2019-01-15 13:40 被阅读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;

    }

    相关文章

      网友评论

          本文标题:计蒜客-计数和数数

          本文链接:https://www.haomeiwen.com/subject/cjxydqtx.html