递归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;

  }

posted on 2011-07-20 09:46  枫叶飘泪  阅读(7180)  评论(0编辑  收藏  举报