你将如何在C中实现pow(a,b)?条件如下 -

时间:2011-02-13 16:09:19

标签: c

不使用乘法或除法运算符。 您只能使用加/减运算符。

4 个答案:

答案 0 :(得分:9)

一个毫无意义的问题,但可以用对数的属性来解决:

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

注意确保指数函数和对数函数使用相同的基数。


是的,我知道如何使用幻灯片。学习这个技巧会改变你对数的观点。

答案 1 :(得分:4)

如果它们是整数,则很容易将pow(a,b)转换为b的乘法。

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

简单地将a *变为附加

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

如果你把它们组合起来,就可以制作动力。

首先,制作mult(int a,int b),然后用它来制作pow。

答案 2 :(得分: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));
    }

答案 3 :(得分:0)

你已经得到纯粹的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之类的东西中)。