递归gcd()

int gcd( int a, int b)
{
return b==0?a:gcd(b,a%b);
}

特点及意义
  ​​最大公约数​​指某几个整数共有因子中最大的一个。




  例如,12和30的公约数有:1、2、3、6,其中6就是12和30的最大公约数。




  两个整数的最大公约数主要有两种寻找方法:




  * 两数各分解质因子,然后取出同样有的项乘起来




  * 辗转相除法(扩展版)




  和最小公倍数(lcm)的关系:gcd(a, b)×lcm(a, b) = ab




  两个整数的最大公因子可用于计算两数的最小公倍数,或分数化简成最简分数。




  两个整数的最大公因子和最小公倍数中存在分配律:




  * gcd(a, lcm(b, c)) = lcm(gcd(a, b), gcd(a, c))




  * lcm(a, gcd(b, c)) = gcd(lcm(a, b), lcm(a, c))




  在座标里,将点(0, 0)和(a, b)连起来,通过整数座标的点的数目(除了(0, 0)一点之外)就是gcd(a, b)。
编程求解
  //GDC 分解因素法




  #include<iostream>




  using namespace std;




  int main()




  {




  int s,x,y,i;




  i=2;s=1;




  cin>>x,y;




  while(i<x)




  {




  if((x%i==0)&&(y%i==0))//i是其因子




  {s*=i;//符合条件的因子累积




  x/=i;




  y/=i;




  }




  else i=i+1;//测试试除数




  }




  cout<<"GCD is"<<s<<endl;




  return 0;




  }




  虽然可以 计算 但有时结果不是很理想




  //GDC 辗转相除法




  #include<iostream>




  using namespace std;




  int main()




  {




  int m,n,r;




  cin>>m,n;




  if(m<n)




  {int t;




  t=n;n=m;m=t;}




  while(n!=0)




  {




  r=m%n;




  m=n;




  n=r;




  }




  cout<<"GCD is"<<m;




  return 0;




  }




  //work out gcd with sub




  #include <iostream>




  using namespace std;




  int main()




  {




  int x,y,a,b;




  cin>>x>>y;




  a=x;




  b=y;




  while(a!=b)




  if(a>b)




  a-=b;




  else




  b-=a;




  cout<<"Gcd is"<<a;




  return 0;




  }




  //递归法




  #include <iostream>




  using namespace std;




  int gcd(int x,int y)




  {int Gcd;




  if(x%y==0)




  Gcd=y;




  else




  Gcd=gcd(y,x%y);




  return Gcd;




  }




  int main()




  {




  int a,b;




  cin>>a>>b;




  cout<<"Gcd is the hope of our people"<<gcd(a,b);




  return 0;




  }




  #include <iostream>




  using namespace std;




  class Max_gcd




  {




  public:




  int gcd1(int m,int n);




  int gcd2(int m,int n);




  int gcd3(int m,int n);




  int gcd4(int m,int n);




  private:




  int m,n;




  };




  int Max_gcd::gcd1(int m,int n)




  {




  int d=1;




  for(int k=2;k<=m&&k<=n;k++)




  if(m%k==0&&n%k==0)




  d=k;




  return d;




  }




  int Max_gcd::gcd2(int m,int n)




  {




  int k;




  for(k=(m>n ? n:m);m%k!=0||n%k!=0;k--)




  ;




  return k;




  }




  int Max_gcd::gcd3(int m,int n)




  {




  int r;




  do{




  r=m%n;




  m=n;




  n=r;




  }while(r);




  return m;




  }




  int Max_gcd::gcd4(int m,int n)




  {




  int r;




  if(n==0) return m;




  for(r=m%n;r!=0;r=m%n)




  {




  m=n;




  n=r;




  }




  return n;




  }




  int main()




  {




  int x,y;




  int j=1;




  char choice;




  Max_gcd gcd;




  while(j)




  {




  cout<<"-----------------------------------------------"<<endl;




  cout<<" 多种方法求最大公约数:"<<endl;




  cout<<" 试除法求最大公约数a:"<<endl;




  cout<<" 从某个大数求最大公约数b:"<<endl;




  cout<<" 辗转相除法求最大公约数c:"<<endl;




  cout<<" 利用殴几里得算法和循环结构求最大公约数d:"<<endl;




  cout<<"------------------------------------------------"<<endl;




  cout<<"\t\t请选择菜单号(a--d):";




  cin>>choice;




  getchar();




  if(choice=='a')




  {




  cout<<"please input m,n:"<<endl;




  cin>>x>>y;




  cout<<gcd.gcd1(x,y)<<endl;




  }




  if(choice=='b')




  {




  cout<<"please input m,n:"<<endl;




  cin>>x>>y;




  cout<<gcd.gcd2(x,y)<<endl;




  }




  if(choice=='c')




  {




  cout<<"please input m,n:"<<endl;




  cin>>x>>y;




  cout<<gcd.gcd3(x,y)<<endl;




  }




  }




  if(choice=='d')




  {




  cout<<"please input m,n:"<<endl;




  cin>>x>>y;




  cout<<gcd.gcd4(x,y)<<endl;




  }




  return 0;




  }