c++ - 如何减少 abs 函数的数量

标签 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 函数的数量???

最佳答案

好吧,对于初学者来说:

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),因为它们将是“abs-ed"在下一个函数调用中,对吗?

所以你可以简单地同意:

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);
}

关于c++ - 如何减少 abs 函数的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59017630/

相关文章:

c++ - 在 C++ 头文件中包含 fstream 或 ifstream

c++ - Visual Assist 的免费替代品?

c++ - 如何使用 C++ 将终端中的列数保存到变量中?

c++ - const_reference_type 不编译但 const value_type& 编译

c++ - Opengl:如何影响纹理平面上的照明?

c++ - typedef 映射、for 循环调试断言、映射/设置不兼容

c++ - 如何获取 std::numeric_limits<char>::min() 值?

c++ - #ifndef C++ 中包含守卫的语法

c++ - Visual C++ 撤消和重做操作

c++ - 如何通过a在仅cpp文件的情况下初始化静态成员