这是一个练习问题,我在回答时遇到了困难。谁有关于这个公式的线索?我在想这些数字的总和..2^0 + 2^1 +2^2...2^n?(sign = -sign;)是用来做什么的?感谢所有能提供帮助的人。
给出以下函数计算的数学公式的描述。
// Pre: n>=0
// Post: ???
double WhatAmI(int n) {
int result=0;
int ctr=0;
int sign = 1;
while(ctr<=n) {
result = result + power(2,ctr);
sign = -sign;
ctr++;
}
return result;
}发布于 2012-10-04 04:39:50
嗯,这个函数计算这个公式(我可以补充一下,以一种非常低效的方式):
2^(n+1) - 1当然,假设您指的是pow()而不是power() (或者至少它们做的是相同的事情)。其效果是,它创建了一个包含n+1 1的二进制掩码。
WhatAmI(3) = 15 = 0b1111
WhatAmI(4) = 31 = 0b11111
WhatAmI(7) = 255 = 0b11111111正如其他人所提到的,似乎没有使用sign变量。
这是一个更有效的函数,它做的是完全相同的事情:
double WhatAmI(int n) {
return (1 << (n+1)) - 1;
}发布于 2012-10-04 04:37:47
这是一直到2^n的2的幂的相加。
如果你仔细想想,它只是将数字中的每一位都设置为1。
n | result (binary)
----+------------------------------------
0 | 00000000 00000000 00000000 00000001
1 | 00000000 00000000 00000000 00000011
2 | 00000000 00000000 00000000 00000111
3 | 00000000 00000000 00000000 00001111
... | ...
29 | 00111111 11111111 11111111 11111111
30 | 01111111 11111111 11111111 11111111
31 | 11111111 11111111 11111111 11111111当然,您可以在没有循环的情况下进行计算。
该函数在内部使用了一个int,但返回了一个double,因此不清楚这是否被限制为整数。无论哪种方式,公式都只有一行。我会把那部分练习留给你。
注意,如果您只需要处理ints,那么运算符(<<)是pow的一个很好的替代品。
https://stackoverflow.com/questions/12716274
复制相似问题