0

これは私が答えるのに苦労している練習問題です。どなたか公式に心当たりはありませんか?私は数の合計をそう考えていました.. 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;
}
4

2 に答える 2

2

さて、関数は次の式を計算します (非常に非効率的な方法で追加するかもしれません):

2^(n+1) - 1

pow()もちろん、代わりにpower()(または少なくとも同じことをする)ことを意味していると仮定します。その結果、n+11 を含むバイナリ マスクが作成されます。

WhatAmI(3) = 15 =   0b1111
WhatAmI(4) = 31 =   0b11111
WhatAmI(7) = 255 =  0b11111111

他の人が述べたように、sign変数は使用されていないようです。

これは、まったく同じことを行うより効率的な関数です。

double WhatAmI(int n) {
    return (1 << (n+1)) - 1;
}
于 2012-10-03T20:39:49.767 に答える
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。したがって、これが整数に制限されているかどうかは明確ではありません。いずれにせよ、数式は 1 行です。演習のその部分はあなたに任せます。

ints演算子のみを処理する必要がある場合は、( <<) が の代わりになることに注意してくださいpow

于 2012-10-03T20:37:46.820 に答える