我试图做一个函数来获得“最大公约数”。
我的目标是取消分数(它看起来像 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/