C++ 如何解决“乌托邦之树”
乌托邦之树每年经历2个生长周期。第一个生长周期发生在春季,此时它的高度加倍。第二个生长周期发生在夏季,其高度增加1米 现在,一棵新的乌托邦树苗在春天开始时种植。它的高度是1米。你能在N个生长周期后找到树的高度吗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)
#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;
}