gcd() 最大公约数

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

  }

时间: 2024-12-25 21:27:07

gcd() 最大公约数的相关文章

GCD最大公约数递归定理的证明

定理如下: 对任意非负整数a和任意正整数b, gcd(a,b) = gcd(b,a mod b) 首先证明 gcd(a,b) | gcd(b,a mod b) 设 gcd(a,b) = d a mod b = a - b*k (k = a/b 向下取整的整数) 易得 d | a mod b 和 d | b 得出 d | gcd(b,a mod b) (d 为 最大公约数的一个因数) 接下来证明 gcd(b,a mod b) | gcd(a,b) 设 gcd(b,  a mod b) = d 得

gcd —— 最大公约数

//gcd 最大公约数 #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<cmath> using namespace std; int gcd (int a,int b) { if(b==0) return a; return gcd(b,

HDU 2504 又见GCD(最大公约数与最小公倍数变形题)

又见GCD Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18480    Accepted Submission(s): 7708 Problem Description 有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b.若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c. Input 第一行输入一个n

Summary: gcd最大公约数算法

欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数.其计算原理依赖于下面的定理: 定理:gcd(a,b) = gcd(b,a mod b) 证明:a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a = kb +r 因此d也是(a,b)的公约数 因此(a,b

又见GCD hdu2504

题目地址http://acm.hdu.edu.cn/showproblem.php?pid=2504 Problem Description 有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b.若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c. Input 第一行输入一个n,表示有n组测试数据,接下来的n行,每行输入两个正整数a,b. Output 输出对应的c,每组测试数据占一行. Sample Input 2 6 2 12 4 Sample Output 4 8

ACM学习历程—Hihocoder 1177 顺子(模拟 &amp;&amp; 排序 &amp;&amp; gcd)(hihoCoder挑战赛12)

时间限制:6000ms 单点时限:1000ms 内存限制:256MB   描述 你在赌场里玩梭哈,已经被发了4张牌,现在你想要知道发下一张牌后你得到顺子的概率是多少? 假定赌场使用的是一副牌,四种花色的A.2.3.....J.Q.K共52张,这副牌只发给你了4张,你的剩下一张牌从剩下48张中任意取出一张. 顺子指的是点数连续的五张牌,包括10.J.Q.K.A这种牌型(不包含同花顺,即构成顺子的五张牌花色不能相同).参见:https://zh.wikipedia.org/wiki/%E6%92%B

【算法与数据结构】最大公约数和最小公倍数的Java程序

GCD最大公约数 方法:欧几里得算法(辗转相除法), [思想]递归 [思路] [代码] 1 public class Main { 2 public static int gcd(int p, int q) { 3 if (q == 0) { 4 return p; 5 } 6 int r = p % q; 7 return gcd(q, r); 8 } 9 } LCM最小公倍数 追求方便公式法求解. [思路] [代码] 1 public class Main { 2 public static

Matlab 矩阵运算

1.Syms 和sym的区别: syms是定义多个符号是符号变量的意思 sym只能定义一个符号变量,但可以具体到这个符号变量的内容 例:syms f z; %定义下x和y f=sym('a+b+c'); %就只能定义一个f=a+b+c syms可以直接声明符号函数d(r),并且可以对函数的形式进行赋值改变,但是sym却不可以 例:>> syms d(r) >> d=r^2 d =r^2 >> sym d(t) ans =d(t) >> d=t^2 Undef

java大数的基本函数

1.读入 Scanner cin=new Scanner(System.in);// 读入 while(cin.hasNextInt()) //等同于!=EOF,第一数一定要输入整形的 { } 大数的一般是: while(cin.hasNextBigInteger())  //第一个数一定要输入大数的 { } while(t-->0)   //等同于while(t--) { } 2.赋值 BigInteger b=BigInteger.valueOf(a); //a可为int,long,stri

算法分类合集(转)

ACM 所有算法 数据结构 栈,队列,链表 哈希表,哈希数组 堆,优先队列双端队列可并堆左偏堆 二叉查找树Treap伸展树 并查集集合计数问题二分图的识别 平衡二叉树 二叉排序树 线段树一维线段树二维线段树 树状数组一维树状数组N维树状数组 字典树 后缀数组,后缀树 块状链表 哈夫曼树 桶,跳跃表 Trie树(静态建树.动态建树) AC自动机 LCA和RMQ问题 KMP算法 图论 基本图算法图广度优先遍历深度优先遍历拓扑排序割边割点强连通分量Tarjan算法双连通分量强连通分支及其缩点图的割边和