2015-11-06 68 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; 
}