2011-02-13 94 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等東西中)。

相關問題