请考虑以下系列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;
}
答案 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;
}