欧几里得算法求最小公倍数和最大公约数

欧几里得算法

  • 最大公约数
    • 计算原理
    • C语言实现:
    • C++实现
    • Java实现
  • 最小公倍数

定义: 欧几里得算法又称辗转相除法,是指用于计算两个非负整数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)的公约数相等,则其最大公约数也相等,得证。
欧几里得算法求最小公倍数和最大公约数_第1张图片

欧几里得算法求最小公倍数和最大公约数_第2张图片
r=a mod b,上式就是一次辗转相除法,由于余数r式逐渐减少的,到某一时刻他会为零,即
在这里插入图片描述
很明显m就是a和b之间的最大公约数了,比如2115的最大公约数如下:
在这里插入图片描述

C语言实现:

常规:

#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;
}

C++实现

#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;
}

Java实现

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);
}
}

最小公倍数

最小公倍数可以通过最大公约数求:最小公倍数 = 两数之和 / 最大公约数
欧几里得算法求最小公倍数和最大公约数_第3张图片

你可能感兴趣的:(算法,数理算法)