C++ 如何解决“乌托邦之树”

C++ 如何解决“乌托邦之树”,c++,C++,乌托邦之树每年经历2个生长周期。第一个生长周期发生在春季,此时它的高度加倍。第二个生长周期发生在夏季,其高度增加1米 现在,一棵新的乌托邦树苗在春天开始时种植。它的高度是1米。你能在N个生长周期后找到树的高度吗 #include <iostream> using namespace std; int height(int n) { int h[61],i; h[0]=1; for(i=1;i<61;i++) { if (i%2!=0)

乌托邦之树每年经历2个生长周期。第一个生长周期发生在春季,此时它的高度加倍。第二个生长周期发生在夏季,其高度增加1米

现在,一棵新的乌托邦树苗在春天开始时种植。它的高度是1米。你能在N个生长周期后找到树的高度吗

#include <iostream>
using namespace std;

int height(int n) {
    int h[61],i;
    h[0]=1;

    for(i=1;i<61;i++)
       { if (i%2!=0)               
           h[i]=h[i-1]*2;            
        else h[i]=h[i-1]+1;
}
    cout<<h[n];

    return 0;
}
int main() {
    int T;
    cin >> T;              
    while (T--) {
        int n;
        cin >> n;
        cout << height(n) << endl;
    }
}
如果输入2 0 1,代码将根据您的程序生成10和20。您可能需要查看您的输出和从函数返回的内容,以及您对结果所做的操作

注意,您还应该始终检查输入是否确实成功,例如使用if std::cin>>T{…}。但是,这不是代码中的问题。

您应该在此处返回h[n],而不是0:

它正在为下一次通话打印1和2,然后由于声明:

cout << h[n];
cout<<height(n);
它正在为下一次呼叫打印0和0。因此,它打印1和0表示高度[0],然后打印2和0表示高度[0]

总结:

从函数返回h[n],而不是0。 另外,在cout中使用tab或换行符可以最大限度地减少混淆。 为什么同时打印高度和主值。简单地说,主要是这样做
函数int heightint应该返回h[n];这里不是打印h[n]cout,而是一个简单的解决方案,可以避免过多的计算。 请注意以下事项:

n:      Height:     Hint:
0       1           2^0

1       2*1=2       2^1
2       2+1=3       2^2 -1

3       2*3=6       2^3 -2
4       6+1=7       2^3 -1

5       2*7=14      2^4 -2
6       14+1=15     2^4 -1

7       2*15=30     2^5 -2
8       30+1=31     2^5 -1

9       2*31=62     2^6 -2
10      62+1=63     2^6 -1

11      2*63=126    2^7 -2
12      126+1=127   2^7 -1

13      2*127=254   2^8 -2
14      254+1=255   2^8 -1

15      2*255=510   2^9 -2
16      510+1=511   2^9 -1

and so on and so forth...
这意味着我们可以使用位移位和避免for循环等。下面是一个简单的解决方案:

int main(){
    //number of test cases
    int t;
    cin >> t;
    for(int i= 0; i< t; ++i){
        //number of cycles for the tree growth
        int n;
        cin >> n;
        if (n == 0)
            cout << 1 << endl;
        else if (n == 1)
            cout << 2 << endl;
        else if (n > 1){ 
                cout << ((1 << ( (n & 1) ? ((n+1)/2) : (n/2)) + 1) - ((n & 1) ? 2 : 1)) << endl;
        }
    }        
    return 0;
}

关键是对奇数和偶数的循环数进行分类,并进行相应的处理。

函数数组如何

typedef int(*FunctionPrt)(int);

int utopianTree(int n) {
    int initialHeight = 1;

    FunctionPrt functions[] = {
        [](int initialHeight) { return initialHeight * 2; },
        [](int initialHeight) { return initialHeight + 1; }
    };

    for (int cycles = 0, i = 0; cycles < n; i = (i + 1) % 2, ++cycles) {
        initialHeight = functions[i](initialHeight);
    }
    return initialHeight;
}

您在函数中输出高度,然后函数在main中返回值,该值始终为0。在函数中丢失输出,只返回h[n];,让法院感谢@WhozCraig!我真的不知道我为什么这么做!
int main(){
    //number of test cases
    int t;
    cin >> t;
    for(int i= 0; i< t; ++i){
        //number of cycles for the tree growth
        int n;
        cin >> n;
        if (n == 0)
            cout << 1 << endl;
        else if (n == 1)
            cout << 2 << endl;
        else if (n > 1){ 
                cout << ((1 << ( (n & 1) ? ((n+1)/2) : (n/2)) + 1) - ((n & 1) ? 2 : 1)) << endl;
        }
    }        
    return 0;
}
typedef int(*FunctionPrt)(int);

int utopianTree(int n) {
    int initialHeight = 1;

    FunctionPrt functions[] = {
        [](int initialHeight) { return initialHeight * 2; },
        [](int initialHeight) { return initialHeight + 1; }
    };

    for (int cycles = 0, i = 0; cycles < n; i = (i + 1) % 2, ++cycles) {
        initialHeight = functions[i](initialHeight);
    }
    return initialHeight;
}