今天在刷java算法题的时候做到了一个求最大公约数的题,一般思路都是从大到小遍历,在翻题解的时候看到了这个,就想记录一下
简介
辗转相除法,又名欧几里得算法,用于求两个数 a , b 的最大公约数(最大公因子),表达式为 gcd(a, b) = gcd(b, a % b) ,其中 gcd 是 Great Common Divisor (最大公约数) 的缩写。
关键就是理解 gcd(a, b) = gcd(b, a % b) 这个等式,即 a, b 的最大公约数等于 b 与 a / b 余数 的最大公约数相等。
直到最后那个使得余数为零的除数,此时最大公约数为此除数
这里可以举例来看:
比如:36与24 现已知36与24的最大公比为12
计算:
36 / 24 = 1.....12(余)
24 / 12 = 2.....0
//得 36与24最大的公约数为12
再比如
144与84
144 / 84 = 1.......60(余)
84 / 60 = 1.......24(余)
60 / 24 = 2.......12(余)
24 / 12 = 2.......0
//得最大的公约数为12
即最后使余数为0的除数即为所求
代码实现
//Java代码
import java.util.*;
public class Main
{
static int gcd(int a,int b)
{
if(b>0) return gcd(b,a%b); //辗转相除法
else return a;
}
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
int x=sc.nextInt(),y=sc.nextInt();
System.out.print(gcd(x,y));
}
}
//C
void main()
{
int a,b,c;
printf("请输入两个整数:");
scanf("%d%d",&a,&b);
if(a<b)
{c=a;a=b;b=c;}
while(c=a%b)
{a=b;b=c;}
printf("最大公约数为:%d\n,b};