我试图使函数获得“最大的公共分隔线”。
我的目的是取消分数(它看起来像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功能的数量?
答案 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);
}