乌托邦树每年经历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;
}
}
答案 0 :(得分:2)
这是一个避免过多计算的简单解决方案。 请注意以下事项:
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...
这意味着我们可以使用位移和避免循环等。这是一个简单的解决方案:
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;
}
关键是要对奇数和偶数的循环次数进行分类并相应地进行处理。
答案 1 :(得分:1)
如果您输入10
,代码应根据您的程序生成20
和2 0 1
。您可能希望查看输出内容以及从函数返回的内容以及对结果执行的操作。
请注意,还总是要检查您的输入是否真正成功,例如使用if (std::cin >> T) { ... }
。但是,这不是代码中的问题。
答案 2 :(得分:1)
您应该在此处返回h[n]
而不是0
:
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]<<endl;
return h[n];
}
另请注意,它正在打印10
和20
,因为h[n]
的值实际上是1
和2
本身,但函数正在返回{ {1}}本身。
由于声明:
0
打印cout << h[n];
(和1
进行下一次调用)然后由于声明:
2
正在打印cout<<height(n);
(和0
以进行下一次通话)。因此,它为0
打印1
和0
,然后为height[0]
打印2
和0
。
<强>摘要强>:
height[0]
返回h[n]
。0
的标签或换行符可以最大限度地减少混淆。cout
和height()
中打印值。只需在main()
答案 3 :(得分:0)
函数int height(int)应该返回h [n];而不是打印h [n](cout&lt;&lt; h [n];)然后返回0(在你想要的1,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 h[n];
}
int main() {
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
cout << height(n) << endl;
}
}
答案 4 :(得分: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;
}