1

演習では、最も基本的な算術演算を使用して指数関数を実装する必要があります。私はこれを思いついた。ここで、xは底であり、yは指数である。

function expAetB() {
     product=1;
     for (i=0; i<y; i++)
     {
          product=product*x;
     }
     return product;
};

ただし、より基本的な操作がありproduct=product*x;ます。どういうわけか、結果を乗算して渡す別のループを挿入できるはずforですが、無限ループに陥ることなくそれを行う方法を見つけることができません。

4

1 に答える 1

2

べき乗が繰り返される乗算と同じように、乗算は単に繰り返される加算です。

それを行う別の関数を作成mulAetBし、負の入力などに注意してください。

さらに1つのレベルに進んで、インクリメントとデクリメントの観点から追加を定義することもできますが、それはやり過ぎかもしれません。


たとえば、過剰な加算方法を使用する次のプログラムを参照してください。

#include <stdio.h>

static unsigned int add (unsigned int a, unsigned int b) {
    unsigned int result = a;
    while (b-- != 0) result++;
    return result;
}

static unsigned int mul (unsigned int a, unsigned int b) {
    unsigned int result = 0;
    while (b-- != 0) result = add (result, a);
    return result;
}

static unsigned int pwr (unsigned int a, unsigned int b) {
    unsigned int result = 1;
    while (b-- != 0) result = mul (result, a);
    return result;
}

int main (void) {
    int test[] = {0,5, 1,9, 2,4, 3,5, 7,2, -1}, *ip = test;
    while (*ip != -1) {
        printf ("%d + %d = %3d\n"  , *ip, *(ip+1), add (*ip, *(ip+1)));
        printf ("%d x %d = %3d\n"  , *ip, *(ip+1), mul (*ip, *(ip+1)));
        printf ("%d ^ %d = %3d\n\n", *ip, *(ip+1), pwr (*ip, *(ip+1)));
        ip += 2;
    }
    return 0;
}

このプログラムの出力は、計算が正しいことを示しています。

0 + 5 =   5
0 x 5 =   0
0 ^ 5 =   0

1 + 9 =  10
1 x 9 =   9
1 ^ 9 =   1

2 + 4 =   6
2 x 4 =   8
2 ^ 4 =  16

3 + 5 =   8
3 x 5 =  15
3 ^ 5 = 243

7 + 2 =   9
7 x 2 =  14
7 ^ 2 =  49

本当に単一の関数に含める必要がある場合は、関数呼び出しをリファクタリングしてインラインにするだけです。

static unsigned int pwr (unsigned int a, unsigned int b) {
    unsigned int xres, xa, result = 1;

    // Catch common cases, simplifies rest of function (a>1, b>0)

    if (b == 0) return 1;
    if (a == 0) return 0;
    if (a == 1) return 1;

    // Do power as repeated multiplication.

    result = a;
    while (--b != 0) {
        // Do multiplication as repeated addition.

        xres = result;
        xa = a;
        while (--xa != 0)
            result = result + xres;
    }

    return result;
}
于 2013-02-08T02:36:24.567 に答える