定义: 欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)
。
欧几里得算法和扩展欧几里得算法可使用多种编程语言实现。
最大公因数Greatest Common Divisor(GCD)
,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。求最大公约数有多种方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。与最大公约数相对应的概念是最小公倍数,a,b的最小公倍数记为[a,b]。
证法一:
a可以表示成a = kb + r(a,b,k,r皆为正整数,且r
假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被d整除。
而r = a - kb,两边同时除以d,r/d=a/d-kb/d=m,由等式右边可知m为整数,因此d|r
因此d也是b,a mod b的公约数。
因(a,b)和(b,a mod b)的公约数相等,则其最大公约数也相等,得证。
r=a mod b
,上式就是一次辗转相除法,由于余数r
式逐渐减少的,到某一时刻他会为零,即
很明显m就是a和b之间的最大公约数了,比如21
和15
的最大公约数如下:
常规:
#include<stdio.h>
int main()
{
int m,n,i;
scanf("%d",&m);
scanf("%d",&n);
for(i=m;i>=1;i--)
if(m%i==0 && n%i==0)
break;
printf("%d\n",i);
return 0;
}
递归算法:
#include <stdio.h>
/*
* 最大公约数的递归:
* 1、若a可以整除b,则最大公约数是b
* 2、如果1不成立,最大公约数便是b与a%b的最大公约数
* 示例:求(140,21)
* 140%21 = 14
* 21%14 = 7
* 14%7 = 0
* 返回7
* */
int gcd(int a,int b){
if(b==0) return a;
return gcd(b,a%b);
}
int main() {
int a,b;
while(scanf("%d%d",&a,&b)!=EOF){
printf("%d",gcd(a,b));
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
int m,n;
cin>>m>>n;
cout<<__gcd(m,n);
}
#include<cstdio>
int GCD(int a,int b)
{
return a%b?GCD(b,a%b):b;
}
int main()
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d",GCD(x,y));
return 0;
}
import java.util.Scanner;
public class Six {
public static void main(String[] args) {
System.out.print("请输入a和b");
Scanner scan = new Scanner(System.in);//以空格作为分隔符
int a = scan.nextInt();
int b = scan.nextInt();
int middle1,middle2,middle3;
middle1=a;
middle2=b;
middle3=0;
for (int i=0;i<i+1;i++) {
middle3=middle1%middle2;
if(middle3==0)
break;
else{
middle1=middle2;
middle2=middle3;
}
}
System.out.println("最大公约数为:"+middle2);
}
}