2015-11-06 67 views
0

我寫我的程序計算:函數計算logarit

#include <stdio.h> 

int cal(int a, int b){ 
    if (a == 0){ 
     return 1; 
    } 
    else if (a == 1){ 
     return b; 
    } 
    else{ 
     int c = a/b; 
     return (cal(a, c) + 1); 
    } 
} 

int main(){ 
    printf("Enter values: "); 
    int a, b; 
    scanf("%d%d", &a, &b); 
    printf("%d\n", cal(a, b)); 
    return 0; 
} 

但是,當我乳寧我的程序。我有一個錯誤。 所以。我的程序錯誤或編程C,C++有什麼問題? 感謝您查看我的問題。

+1

'我有一個(n)錯誤'... ..分享。 –

+0

提示 - >:'int c = a/b;'如果'b'是'0',該怎麼辦? –

+0

請指定您是用C還是用C++編程。 – fuz

回答

1

我很好!感謝大家。這是我的失敗。 我改變我的程序相同:

#include <stdio.h> 

int cal(int a, int b){ 
    if (a == 0){ 

     return 0; 
    } 
    else if (a == 1){ 
     return b; 
    } 
    else if (b == 0){ 
     return 1; 
    } 
    else if (b == 1){ 
     return 0; 
    } 
    else{ 
     return (cal(a, b/a) + 1); 
    } 
} 

int main(){ 
    printf("Enter values: "); 
    int a, b; 
    scanf("%d%d", &a, &b); 
    printf("%d\n", cal(a, b)); 
    return 0; 
} 
0
int c = a/b; 

會給你一個運行時錯誤,如果你不檢查b不允許被0。 添加一個條件來驗證b實際上不是0,如果是,則不要執行除法操作。

+0

當我改變它。它不能再次調用函數cal。例如:a = 2,b = 8。結果= 2.那麼你能指導我如何寫它?非常感謝! –

+0

@NguyễnVănDũng從你的程序中你想要什麼邏輯是你自己決定的,但一般來說,你不能以零除。 – Magisch

0

您遇到了無限遞歸。它看起來好像你有一個終止條件,但沒有遞歸的退出檢查a,這在你的調用中總是一樣的。

因爲,您的算法在奇數和偶數遞歸步驟中分別調用cal(a, b)cal(a, a/b)。最終,你用完了堆棧。

修改您的算法,以便更深的遞歸進展到基本狀態,您應該檢查。

如果你想計算的a對數爲基礎b,你應該基本保持在調用和sucessively鴻溝a基礎b不變,直到你到達的情況下a落在基地下方的值:

int intlog(int a, int b) 
{ 
    if (a < b) return 0; 

    return cal(a/b, b) + 1; 
}