2011-02-13 6 views
0

乗算または除算演算子を使用しません。 加算演算子と減算演算子のみ使用できます。Cでpow(a、b)をどのように実装しますか?条件は次のとおりです。 -

+3

比較演算子はありません。 – bdonlan

+3

代入演算子はどうですか?その演算子を使用できますか? –

+6

"乗算または除算演算子を使用せずにCでpow(a、b)をどのように実装しますか?"私はしません。 –

答えて

9

無意味な問題が、対数の性質に解ける:

pow(a,b) = exp(b * log(a)) 
     = exp(exp(log(b) + log(log(a))) 

は、あなたの指数関数と対数関数が同じベースを使用していることを保証するように注意してください。


はい、私はスライダーを使用する方法を知っています。そのトリックを学ぶことで、あなたの対数の見方が変わります。

+1

これは 'exp(b * log(a))'ではありませんか? 「pow(a、b)」は、通常、「bの力に上げられた」という意味であり、それ以外の意味ではありません。 –

+0

@Sergey、ええと...ええ。ありがとう。 – dmckee

4

整数の場合は、pow(a、b)をaのb乗法に変換するのは簡単です。あなたがそれらを結合する場合は、あなたが捕虜を作ることができるの追加

a * a = a + a + a + a + ... ; // do this a times 

に* aをオンにする

pow(a, b) = a * a * a * a ... ; // do this b times 

とシンプル。

まず、mult(int a、int b)を作成し、それを使ってpowを作ります。

2

再帰的なソリューション:

#include<stdio.h> 




    int multiplication(int a1, int b1) 
    { 
     if(b1) 
     return (a1 + multiplication(a1, b1-1)); 
     else 
     return 0; 
    } 

    int pow(int a, int b) 
    { 

     if(b) 
     return multiplication(a, pow(a, b-1)); 
     else 
     return 1; 
    }  


    int main() 
    { 
     printf("\n %d", pow(5, 4)); 
    } 
+0

大きな指数のためにこれは悲惨に失敗します:) –

+1

@mzabskyなので、コードは決して実行されません! –

0

あなたはすでに純粋にFPのためだけで純粋に整数のための答えを得ています。 FP番号を整数に上げたFP番号の例を次に示します。

double power(double x, int y) { 
    double z = 1.0; 

    while (y > 0) { 
     while (!(y&1)) { 
      y >>= 2; 
      x *= x; 
     } 
     --y; 
     z = x * z; 
    } 
    return z; 
} 

これは乗算を使用しています。ビットシフト、数ビットの比較、および加算のみを使用して乗算を実装できます。整数の場合には、次のようになります。あなたの結果を標準化する必要がある以外

int mul(int x, int y) { 
    int result = 0; 
    while (y) { 
     if (y&1) 
      result += x; 
     x <<= 1; 
     y >>= 1; 
    } 
    return result; 
} 

浮動小数点は、ほとんど同じである - すなわち、本質的には、浮動小数点数は、1)有効数字は、(通常のように表現されますかなり大きい)整数、および2)スケールファクタ。通常のIEEEの浮動小数点数を生成したい場合、いくつかの部分は少し醜いです - たとえば、倍率は通常の1の補数、2の補数などの代わりに "バイアス"数として格納されます。それを使って作業するのは不器用です(基本的に、バイアスからそれぞれの演算を減算し、演算を行い、オーバーフローをチェックし、オーバーフローしていないと仮定してバイアスをもう一度加えます)。

論理テストを一切行わずに仕事をしているのは、実際には意図されていなかったように思えます。かなりの数のコンピュータアーキテクチャークラスでは、ハードウェアで直接表現できる基本的な操作(ビットシフト、ビット単位 - ビット単位 - AND、 - OR、 - NOTなど)に問題を減らすのは面白いです。上記の実装は、 (技術を手に入れたいのであれば、加算器にはいくつかのゲートが必要ですが、VHDL、Verilogなどですが、VHDLやVerilogなどのものに含まれています)。

関連する問題