首页 > 编程语言 >C++欧几里得算法求最大公约数和最小公倍数

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

时间:2023-08-11 18:45:08浏览次数:40  
标签:frac gcd 公倍数 mid C++ int 最大公约数 公约数

定义

最大公约数即为 Greatest Common Divisor,常缩写为 gcd。
一组整数的公约数,是指同时是这组数中每一个数的约数的数。
一组整数的最大公约数,是指所有公约数里面最大的一个。
那么如何求最大公约数呢?我们先考虑两个数的情况。

欧几里得算法

过程

如果我们已知两个数 \(a\) 和 \(b\),如何求出二者的最大公约数呢?
不妨设\(a > b\)
我们发现如果 b 是 a 的约数,那么 b 就是二者的最大公约数。 下面讨论不能整除的情况,即\(a = b * q + r\),
其中\(r < b\)
我们通过证明可以得到\(gcd(a, b) = gcd(b, amodb)\),过程如下:
设 \(a=bk+c\),显然有 \(c=a \bmod b\)。设 \(d \mid a\),\(~d \mid b\),则\(c=a-bk\), \(\frac{c}{d}=\frac{a}{d}-\frac{b}{d}k\)。
由右边的式子可知\(\frac{c}{d}\) 为整数,即 \(d \mid c\),所以对于 \(a\),\(b\) 的公约数,它也会是 \(b\),\(a \bmod b\) 的公约数。
反过来也需要证明:
设 \(d \mid b\),\(~d\mid (a \bmod b)\),我们还是可以像之前一样得到以下式子
\(\frac{a\bmod b}{d}=\frac{a}{d}-\frac{b}{d}k,~\frac{a\bmod b}{d}+\frac{b}{d}k=\frac{a}{d}\)。
因为左边式子显然为整数,所以\(\frac{a}{d}\) 也为整数,即 d \mid a,所以 b,a\bmod b 的公约数也是 a,b 的公约数。
既然两式公约数都是相同的,那么最大公约数也会相同。
所以得到式子\(gcd(a, b) = gcd(b, amodb)\)
既然得到了 \(\gcd(a, b) = \gcd(b, r)\),这里两个数的大小是不会增大的,那么我们也就得到了关于两个数的最大公约数的一个递归求法。

实现

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

最小公倍数

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

标签:frac,gcd,公倍数,mid,C++,int,最大公约数,公约数
From: https://www.cnblogs.com/ypzmlmf/p/gcd.html

相关文章

  • C++ 20新版本的重大更新来了
    作为Google和Microsoft使用的核心编程语言,C++新版本获得了国际标准化组织的批准。国际标准化组织(ISO)C++工作组,即第21工作组(WG21),已同意发布C++20版本的最终版内容。对于这个有着35年历史的C++编程语言,这是自2017年发布C++17版本后的首次重大更新。WG21C++ISO委员会......
  • 关于dev c++显示中文不显示,乱码和生成的可执行文件中文乱码
    1.不显示中文工具----编译器选项----显示-----去掉底下的复选框(第一个consolas下面)2,运行窗口中文乱码方法:1、工具—编译选项2、在第一个框中填入-fexec-charset=gbk3、勾选“编译器加入以下命令”4、重新编译一次以后运行。  ......
  • C++ 各代版本以及主要区别
    和大家平时用的APP等一样,编程语言每隔一段时间也需要重新制定标准。C++作为老牌编程语言,有着丰富的STL库以及比较规范的语法,是一个比较受欢迎且适合初学者接触编程时的第一个语言,本文简单介绍一下C++的主要版本更替,以及C++11标准和之前的有何区别。版本更替1.C++98第一版ISO/IEC......
  • C++11实用特性3 --智能指针
    1智能指针在C++中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针(smartpointer)。智能指针是存储指向动态分配(堆)对象指针的类,用于生存期的控制,能够确保在离开指针所在作用域时,自动地销毁动态分配的对象,防止内存泄露。智能......
  • C++使用Py*调用Python3模块中类成员函数及数组参数传递
    1.首先来看Python模块的部分结构和代码。ssd_network_classify.py文件中有SSD_Network_Classify类及其识别的成员函数detect_image(),返回值是一个1维的不定长double型数组。classSSD_Network_Classify:#其他函数实现省略。。。defdetect_image(sel......
  • c++ 使用移动语义来提高 vector 性能
    本文学习了微软的官方实例,用于理解std::move语义。#pragmaonce#include<iostream>#include<algorithm>#include<vector>usingnamespacestd;classMemoryBlock{public://Simpleconstructorthatinitializestheresource.explicitMemoryBl......
  • C++调用Python传入参数、图片并接受返回值
    最近在做C++调用Pytorch模型进行识别的任务,C++关于Pytorch的教程很少,基本上都是用Python写的,但因为要识别任务是实时的,Python的执行效率不如C++,所以主题代码还是没用Python。网上利用C++调用Pytorch模型的方法主要是把模型文件转化成C++可以加载和执行的模型文件,利用的是TorchS......
  • C++ #pragma once指令:保护C++头文件不被重复包含
    一、#ifndef/#define/#endif指令的问题在C++中,头文件的作用就是将代码以模块的形式组织起来,便于复用和维护。但是,头文件很容易出现重复定义的问题。比如,某个头文件被多个源文件包含,这些源文件又有可能被其他源文件包含,那么就有可能出现一个头文件被重复包含的情况。这样就会......
  • C++多线程不加锁操作同一个整数
    #include<iostream>#include<thread>#include<vector>#include<chrono>#include<atomic>usingnamespacestd;intnum=0;//volatileintnum=0;//atomic<int>num=0;voidadd(){inttimes=0;for(int......
  • VS2019 C++ 调用python函数/类对象的方法
    1.环境配置VS工程配置要和python一致,安装的python如果是64位的,工程配置也要选成64位的在工程配置中添加包含目录和库目录,添加python环境目录里的include和libs文件夹路径。想要运行的keras-yolo3是在Anaconda中配置的环境,所以相应的文件夹路径可以在Anaconda的环境文件中......