有什么办法可以生成以下系列?

时间:2019-03-24 15:00:22

标签: c++

请考虑以下系列sk=s(k-1)(!s(k-1))(!s(k-1))s(k-1)。取s1=1221!s1=2112,取s2=s1(!s1)(!s1)s1,即s2=1221211221121221

我当前的目标是生成该系列的n个元素,然后确定第n个元素。如果使这个问题听起来很复杂,我感到抱歉。

我试图使这项工作有效,但是代码只是没有显示正确的答案,或者根本不起作用。我希望对这个问题有另一种看法。

这是我的代码:

#include <iostream>

using namespace std;

int main()
{
    int n,k=1,a,b,s=1,p=1,i=1;
    a=1;b=2;
    cin>>n;
    while(i<=n){
        if(s==1){
            if(k==1){
                cout<<a;
                i++;
                k++;
            }
            else{if(k==2||k==3){
                cout<<b;
                i++;
                k++;
            }
                if(k==4){
                    cout<<a<<" ";
                    i++;
                    k=1;p++;
                    if(p==2) {s=2;p=0;}
                }
        }}
        if(i<=n){
        if(s==2){
            if(k==1){
                cout<<b;
                i++;
                k++;
            }
            else{if(k==2||k==3){
                cout<<a;
                i++;
                k++;
            }
                if(k==4){
                    cout<<b<<" ";
                    i++;
                    k=1;p++;
                    if(p==2) {s=1;p=0;}
                }
        }
    }
    }}
    return 0;
}

1 个答案:

答案 0 :(得分:0)

这是您的序列发生器的一种可能的解决方案。

#include <iostream>
#include <string>

// generate inverted term s -> !s
std::string invert(const std::string& s) {
    const char a = '1';
    const char b = '2';
    std::string out;
    for (int i = 0; i < s.size(); i++) {
        // here one can check for invalid input as well, eg 0
        out += s[i] == a ? b : a;
    }
    return out;
}

// sk = s(k - 1)(!s(k - 1))(!s(k - 1))s(k - 1)
std::string nextSeq(const std::string& s) {
    std::string s_inv = invert(s);
    return s + s_inv + s_inv + s;
}

// generate nth term of the sequence.
std::string nthSeq(const std::string& s, const int n) {
    std::string out = s;
    for (int i = 1; i < n; i++) {
        out = nextSeq(out);
    }
    return out;
}

int main() {
    std::string s1 = "1221";
    // this will 2nd term 1221211221121221
    std::cout << nthSeq(s1, 2) << std::endl;
    return 0;
}