为什么辗转相除法可以求最大公约数

假设有a,b两个数(a>b),求它们的最大公约数。

  1. a = b*k + c
  2. c = a - b*k
  3. 设d为a和b的公约数(b是从公约数中任取出来的)
  4. 所以d也是b和c的公约数(举例:a为3*5,b为2*5, d为5,c为1*5, a-b(c)的结果肯定是d的n倍,所以d也是b和c的公约数)
  5. 所以d既是a和b的公约数,也是b和c(a%b)的公约数
  6. 由d的任意性可得:a和b的公约数都是b和a%b的公约数。
  7. a = b*k + c,同理可得b和a%b的公约数都是a和b的公约数。(相当于是以小推大)
  8. 综上所述:a和b的公约数与b和a%b的公约数全部相等,故其最大公约数也相等,gcd(a, b) = gcd(b, a%b)

c++实现
注意点

  • 如果a>b,交换两者的位置
  • 递归边界:0和任意整数a的公约数都是a(注意:不是0)
  1. 递归式:gcd(a, b) = gcd(b, a%b)
  2. 递归边界:gcd(a, 0) = a
#include <iostream>
#include <algorithm>
using namespace std;

/*
you can write in a simplier way.

int gcd(int a, int b) {
    return b == 0? b: gcd(a, a%b);
}
*/

int gcd(int a, int b) {
    if(b == 0) return a;
    else return gcd(b, a%b);
}

int main(int argc, char const *argv[])
{
    int a, b;
    while(scanf("%d%d", &a, &b) != EOF) {
        if(a < b) swap(a, b);
        int res = gcd(a, b);
        printf("%d\n", res);
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 4,045评论 0 2
  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 10,582评论 0 13
  • 基本概念 因数 :若A=m×n,则称m,n是A的因数;A是m,n的倍数 一个数的最大因数和最小倍数都...
    AQ王浩阅读 2,266评论 0 4
  • 本文要证明的题目是欧几里得法(碾转相除法)求得的结果是两个数的最大公约数,本文用gcd(a,b)来表示最大公约数。...
    YongpingZhao阅读 1,628评论 0 0
  • 刚刚花一个月时间把叔本华《人生的智慧》看完了,受益颇多。想要写一篇读后感,却觉得千言万语,不知从何入手。姑且先写写...
    换换_205c阅读 258评论 0 2

友情链接更多精彩内容