如何减少Abs功能的数量

时间:2019-11-24 12:27:17

标签: c++

我试图使函数获得“最大的公共分隔线”。

我的目的是取消分数(它看起来像a / b,所以如果是3/6,它将变成1/3)。

要做到这一点,我还需要负数的“ gcd”,但是“ gcd”不能像这样工作,所以你必须使用abs函数。

int NOD(int a,int b){
    if(abs(a)==abs(b)){
        return abs(a);
    }
    if(abs(a)<abs(b)){
        return NOD(abs(a),abs(b-a));
    }
    else{
        return NOD(abs(a-b),abs(b));
    }
}

如何减少这些Abs功能的数量?

1 个答案:

答案 0 :(得分:2)

嗯,对于初学者:

int NOD(int a, int b) {
    int abs_a = abs(a);
    int abs_b = abs(b);
    if (abs_a == abs_b)
        return abs_a;
    if (abs_a < abs_b)
        return NOD(abs_a, abs(b-a));
    return NOD(abs(a-b), abs_b);
}

说实话,我很确定您甚至不需要abs(b-a)abs(a-b),因为在下一个函数调用中它们将被“吸收”,对吗?

因此,您可以简单地选择:

int NOD(int a, int b) {
    int abs_a = abs(a);
    int abs_b = abs(b);
    if (abs_a == abs_b)
        return abs_a;
    if (abs_a < abs_b)
        return NOD(abs_a, b-a);
    return NOD(a-b, abs_b);
}

如果您想完全摆脱abs,那么您只需在代码中模拟其行为即可:

int NOD(int a, int b) {
    int abs_a = a > 0 ? a : -a;
    int abs_b = b > 0 ? b : -b;
    if (abs_a == abs_b)
        return abs_a;
    if (abs_a < abs_b)
        return NOD(abs_a, b-a);
    return NOD(a-b, abs_b);
}