2017-07-20 44 views
-4

找到沒有pow的整數m的n次冪的C程序。通過沒有pow的C程序找到整數m的n次冪()

輸入:

m=3 n=2 
output: 
9.000 

測試,以驗證程序按預期工作!

  1. 對於負中號
Input : -2 3 
output : -8.000 
  • 對於負Ñ
  • Input : 2 -3 
    output : 0.125000 
    
  • 對於負M和N
  • Input : -2 -3 
    output : -0.125000 
    

    但是我沒有得到所希望的輸出

    void main() 
    { 
    
        signed int m, n; 
        int i; 
        float p; 
        clrscr(); 
        printf("Enter the number and its power (exponent)\n"); 
        scanf("%d%d",&m,&n); 
        p=1; 
        if (n==0) 
        { 
         printf("%d raised to %d is: %f",m,n,p); 
        } 
    
        if (n>0) 
        { 
         for(i = 0 ; i < n ; i++) 
          p*=m; 
         if(m>0) 
          printf("%d raised to %d is: %f",m,n,p); 
         if(m<0) 
          printf("%d raised to %d is: %f",m,n,-p); 
        } 
    
        if (n<0) 
    
        { 
         n=-n; 
         for(i = 0 ; i < n ; i++) 
          p*=m; 
         if(m>0) 
          printf("%d raised to %d is: %f",m,-n,1/p); 
         if(m<0) 
          printf("%d raised to %d is: %f",m,-n,-(1/p)); 
        } 
        getch(); 
    } 
    

    u能親切地提供正確的測試用例程序?

    我不能聲明signed float,因爲它給出了一個錯誤。

    +3

    對於某些指定的輸入,預期和實際輸出是什麼?你是否嘗試過在調試器中的代碼? –

    +2

    學習如何使用調試器的時間。 –

    +0

    你介意再次運行第三種情況嗎?因爲[this](https://ideone.com/hm0UDX)另有說明。 –

    回答

    4

    底片的代碼是不正確。你不能盲目地否定結果當基地m是負面的。 ,但是。此外,如果m爲零,則不會打印任何內容!

    int s是默認簽名的,所以signed int是噪聲。 float也被簽名;但在這裏你可以使用double更精確。 main的返回值應該是int

    因此固定的代碼是(添加非標準clrscr S和getch s到你的口味):

    #include <stdio.h> 
    #include <stdlib.h> 
    
    int main() 
    { 
        int m, n, i; 
        double p = 1.0; 
        printf("Enter the number and its power (exponent)\n"); 
        scanf("%d%d",&m,&n); 
    
        if (n==0) { 
         printf("%d raised to %d is: %f",m,n,p); 
        } 
    
        else if (n > 0) { 
         for(i = 0; i < n; i++) 
          p*=m; 
         printf("%d raised to %d is: %f",m,n,p); 
        } 
    
        else { // n < 0 
         n = -n; 
         for (i = 0 ; i < n ; i++) 
          p*=m; 
         printf("%d raised to %d is: %f", m, -n, 1/p); 
        } 
    } 
    
    +1

    當他聲稱第三個測試用例驗證通行證時,我感到很驚訝。當我看到這個答案時,反覆做我的腦袋裏的數學:) –

    +0

    謝謝:))爲什麼使用雙?你提到的精度是多少? –

    0

    嘗試改變:

    void main() 
    { 
    
        signed int m, n; 
        int i; 
        float p; 
        printf("Enter the number and its power (exponent)\n"); 
        scanf("%d%d",&m,&n); 
        p=1; 
        if (n==0) 
        { 
         printf("%d raised to %d is: %f",m,n,p); 
        } 
    
        if (n>0) 
        { 
         for(i = 0 ; i < n ; i++) 
          p*=m; 
         printf("%d raised to %d is: %f",m,n,p); 
        } 
    
        if (n<0) 
    
        { 
         n=-n; 
         for(i = 0 ; i < n ; i++){ 
          p*=m; 
         } 
         printf("%d raised to %d is: %f",m,-n,1/p); 
    
        } 
    
    } 
    
    0

    @Antti Haapala也確定了OP的代碼中的錯誤。


    作爲與pow()替代,當然一個解決方案,需要的log 2 N個步驟(如下)的採訪問題是優選一個取N個步驟(OP的方法),其中N是指數。

    關鍵是在每次迭代中對基礎進行平方。
    使用log2 N步而不是N會導致最小有效數字中的錯誤更少。

    具有負指數,簡單反轉基數。

    使用double來提供以提供至少10個,通常17個十進制數字的精度。

    double powdii(int x, int y) { 
        double z = 1.0; 
        double base = x; 
        if (y < 0) { 
        base = 1.0/base; 
        } 
        while (y != 0.0) { 
        if (y % 2) { 
         z *= base; 
        } 
        y /= 2; 
        base *= base; 
        } 
        return z; 
    } 
    
    相關問題