如上所述here,gcd(a,b)= gcd(-a,b)= gcd(-a,-b)。但是当我使用下面的代码时,输入的输出为(-4,-8)。
gcd(x,y)给出-4而gcd(abs(x),abs(y))给出-4。
有人可以帮助我理解我错在哪里:)
int gcd(int a ,int b)
{
if(b==0)
return a;
return gcd(b,a%b);
}
int main()
{
int x,y;
cin>>x>>y;
cout<<gcd(x,y)<<endl; // gives -4
cout<<gcd(abs(x),abs(y))<<endl; //gives 4
return 0;
}
答案 0 :(得分:1)
您没有考虑到输出范围中有一个加号或减号会破坏您的算法,而是断言负数和正数将被视为正整数。离散数学中的形式集合论对于与大多数编程语言不兼容的符号有不同的术语集。
C++ 中使用递归的最大公分母
int GCD(int A,int B)
{
if(A==0) return B;
if(B==0) return A;
A=abs(A);
B=abs(B);
if(A>B) return GCD(B,A);
return GCD(B%A,A);
}