基础C ++的实践

时间:2012-10-03 20:22:08

标签: c++

这是一个我无法回答的练习题。谁有关于配方的线索?我正在考虑这些数字的总和.. 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;
}

2 个答案:

答案 0 :(得分:2)

好吧,该函数计算这个公式(我可能会以非常低效的方式添加):

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;
}

答案 1 :(得分:1)

这是将{2}的权力加到2^n

如果你考虑一下,它只是将数字中的每一位都设置为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