2011-02-13 98 views
0

不使用乘法或除法运算符。 您只能使用添加/减法运算符。你将如何在C中实现pow(a,b)?条件如下 -

+3

什么,没有比较运营商? – bdonlan 2011-02-13 16:12:22

+3

赋值运算符怎么样?该操作员可以使用吗? – 2011-02-13 16:12:53

+6

“如何在不使用乘法或除法运算符的情况下在C中实现pow(a,b)”?我不会。 – 2011-02-13 16:16:40

回答

9

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

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

小心,以确保您的指数函数和对数函数使用相同的基础。


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

4

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

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

和简单的把一个*一成增加

a * a = a + a + a + a + ... ; // do this a 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

你已经得到答案纯粹的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的补码等,所以与它一起工作是笨拙的(基本上,每个操作你减去偏见,做操作,检查溢出,并且(假设它没有溢出)重新加上偏差)。

做这项工作时没有任何一种逻辑测试听起来(对我而言),因为它可能并非真正意图。对于不少计算机体系结构类,将问题简化为可以直接用硬件表示的原始操作(例如,位移,按位--, - OR和 - NOT等),上述实现非常合适(如果你想获得技术,一个加法器需要几个门,但是VHDL,Verilog等,但它包含在VHDL和Verilog等东西中)。

相关问题