函数计算logarit

时间:2015-11-06 13:33:46

标签: c++ c

我写了我的程序计算:

#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 ++有什么问题? 感谢您查看我的问题。

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

    int c = a / b;

如果不检查b是否不允许0,则会给您一个运行时错误。 添加条件以验证b实际上不是0,如果是,则不执行除法操作。

答案 2 :(得分:0)

你遇到了无限递归。看起来好像你有一个终止条件,但a上的退出没有递归检查,这在你的电话中总是一样的。

按原样,您的算法分别在奇数和偶数递归步骤中调用cal(a, b)cal(a, a / b)。最终,你的用完了。

修改你的算法,以便更深入的递归向基本状态发展,你应该检查。

如果你想计算a到基数b的对数,你应该保持基数b在调用之间保持不变,然后逐渐将a除以基数,直到到达值a低于基数的情况:

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

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